TopProgramming Languagebash > 2014年3月
2014年3月12日

bashで「value too great for base」というエラーになる場合の対処

March 12,2014 1:55 AM
Tag:[]
Permalink

bashで「value too great for base」というエラーになる場合の対処方法を紹介します。

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.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]
2014年3月 3日

bashのfor文のまとめ

March 3,2014 1:55 AM
Tag:[]
Permalink

bashのfor文のまとめです。

bashのfor文

ネットで調べたところ、ケース別ですぐに使えそうなサンプルが並んでいるものがなかったので、このエントリーでまとめてみました。

認識違いがありましたどこかでつぶやいてください。

なお、サンプルでは変数のカーリーブレースやダブルクォーテーションは省略しています。適宜付与してください。

1.フォーマット

bashのfor文のフォーマットは

for 繰り返し条件
do
    # ...
done

となっています。

次のフォーマットでも書けます(以降、このフォーマットで解説)。

for 繰り返し条件; do
    # ...
done

2.初期値・ループ条件・ループ時の処理で指定する

繰り返し条件の部分は一般的なfor文のお作法(初期値、ループ条件、ループ時の処理)が利用できます。

for ((初期値; ループ条件; ループ時の処理)); do
    # ...
done

サンプル

max=10
for ((i=0; i < $max; i++)); do
    echo $i
done

このfor文ではカッコが2つ必要なので注意してください。

3.inを利用する

bashではinを利用する方法があります。

for 変数 in 値のリスト; do
    # ...
done

inを使った場合、値(値のリスト)の指定方法がいくつかあるので次項から紹介します。

4.値を直接指定する

値を直接指定するには、inの後に利用したい値を列挙します。値が連続している必要はありません。

for i in 0 1 3 5 8 9; do
    echo $i
done

値の部分には変数を指定することも可能です。

foo="0"
bar="1 3 5 8 9"
for i in $foo $bar; do
    echo $i
done

5.値を範囲で指定する

値が連続している場合、カーリーブレースで括り、その中の最小値と最大値で設定することができます。

for i in {0..9}; do
    echo $i
done

inの後方でバッククォートを使ってseqコマンドを実行しても同様のことが実現できます。

for i in `seq 0 9`; do
    echo $i
done

バッククォートの部分は$()でも同様のことができます(バッククォートは古い形式なのでこちらが推奨のようです)。

for i in $(seq 0 9); do
    echo $i
done

6.値を配列変数で指定する

配列を利用するには、inの後方に配列名を指定します。

array=(0 1 2 3 4 5 6 7 8 9)
for i in ${array[@]}; do
    echo $i
done

7.値をファイルで指定する

ファイルから読み込む場合、inの後方にバッククォートでファイルの出力処理を記載します。

number.txt

0
1
2
3
4
5
6
7
8
9
for i in $(cat number.txt); do
    echo $i 
done

8.値にコマンドライン引数を利用する

値にコマンドライン引数を利用する場合、「$@」を使います。

for i in "$@"; do
    echo $i
done

以上です。

ここに挙げた以外にも色々あると思うので、適宜追加したいと思います。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3