はじめに
10進数からn進数(2~64進数)に変換するBashスクリプトの関数です。今回は引数チェックも入れました。Bash 4.4.12で動作を確認しています。
コード
conv_digit.sh
function conv_digit()
{
local natural digit quotient surplus sign c64 result
c64='0123456789abcdefghijklmnopqrstuvwxyz'\
'ABCDEFGHIJKLMNOPQRSTUVWXYZ@_'
[[ -n ${1:-} ]] || return
if [[ $1 =~ ^(\+?)([0-9]+)$ ]]
then
sign=${BASH_REMATCH[1]:-}
natural=${BASH_REMATCH[2]};
sign=${sign/+/}
else
echo "${FUNCNAME[0]}($1,$2): Arg 1 is invalid. call"\
"from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
return 1
fi
if [[ -n ${2:-} ]]
then
if [[ $2 -lt 2 || $2 -gt 64 ]]
then
echo "${FUNCNAME[0]}($1,$2): Arg 2 is invalid. call"\
"from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
return 1
else
digit=$2
fi
else
digit=10
fi
echo -n ${sign:-}
while :
do
surplus=$(($natural%$digit))
natural=$(($natural/$digit))
result=${c64:$surplus:1}${result:-}
[[ $natural -eq 0 ]] && break
done
echo $result
}
使い方
.sh
$ . conv_digit.sh
$ conv_digit 17 2
10001
$ conv_digit 31 16
1f
$ conv_digit 31
31
n進数から10進数にするにはBashの組み込み機能で行なえます。
.sh
$ echo $((16#1f))
31
$ echo $((16#$(conv_digit 31 16)))
31
補足
第一引数は変換する10進自然数で、一般的な64ビット環境では0から2^63-1(=9223372036854775807)の範囲の整数となります。先頭に0がつく数字は8進数として認識されるようです。負値や小数は扱えません。指数表記はどうなるか不明です。
なお第二引数は進数を指定します。2から64の整数のみを指定でき、負の値や小数、指数表記はエラーになります。
負値も変換したい場合は、Bashだけで16進数・10進数・2進数間の相互変換を行う をご覧ください。
諸注意
コードはご自由に使って頂いて構いませんが、使用する事のより発生するあらゆる事象に対して一切の保証や補償は致しません。