bashで「value too great for base」というエラーになる場合の対処
bashで「value too great for base」というエラーになる場合の対処方法を紹介します。
1.問題点
次の、2つの引数の合計を出力するスクリプト「test.sh」を実行します。
#!/bin/sh
foo=$(( 8 + 1 ))
echo ${foo}
このスクリプトは正常に実行でき、結果として「9」が表示されます。
[~]$ ./test.sh
9
ところが、次のように「8」の先頭に「0」を付与して「08」とすると、「value too great for base」というエラーが発生します。
#!/bin/sh
foo=$(( 08 + 1 ))
echo ${foo}
[~]$ ./test.sh
./test.sh: line 3: 08: value too great for base (error token is "08")
2.原因
bashでは、先頭が「0」の数値(たとえば「01」や「0123」など)は8進数のデータとして扱われます。
8進数では「7」に「1」を加えると桁が繰り上がって「10」となるので、「8」と「9」という数はそもそも存在しません。
そのため、「08」や「090567」という「8」や「9」を含む値が出現すると「8進数として扱えない数値」とみなされ、「value too great for base」というエラーになるという訳です。
3.対処方法
$(())の代わりにexprを利用します。
#!/bin/sh
foo=`expr 08 + 1`
echo ${foo}
バッククォートの代わりに$()を使うこともできます。
#!/bin/sh
foo=$(expr 08 + 1)
echo ${foo}
これでエラーにならずに期待する実行結果を得ることができます。
[~]$ ./test.sh
9
4.参考サイト
参考サイトは下記です。ありがとうございました。
Posted by yujiro このページの先頭に戻る
- シェルスクリプトのexpectで応答メッセージを振り分ける方法
- bashでPostgreSQLのselect結果を出力する方法
- bashでbackspaceが動作しない場合の対処
- bashの変数から最後の1文字を取得・削除する方法
- bashのwhile文で利用した変数がループ外で反映されない場合の対処
- bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処
- bashの正規表現でスペース(空白)を判定する方法
- bashで文字列の長さを調べる方法
- bashで数値を判定する方法
- bashで小数点を比較する方法
- bashの配列をjoinする方法
- bashのif文で正規表現を使用する方法
- Bashで変数を大文字または小文字に変換する方法
- bashの変数をsplitして配列を作る方法
- シェルスクリプトでtelnet接続する方法
トラックバックURL
コメントする
greeting