引数を整数に変換して算術演算を実行する方法を理解し、それを出力しようとしています。たとえば、addOne.sh
:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Bashでは、「引数を整数に変換して算術演算を行う」ことはしません。 bashでは、変数はコンテキストに応じて整数または文字列として扱われます。
算術を実行するには、算術展開演算子$((...))
を呼び出す必要があります。例えば:
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
または一般的に好ましい:
$ echo "$((a + 1))"
3
(ksh93、zsh、またはyashとは対照的に)bashはinteger演算のみを実行することに注意してください。浮動小数点数(小数を含む数値)がある場合は、他に役立つツールがあります。たとえば、bc
を使用します。
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
または、bashの代わりに浮動小数点演算をサポートするシェルを使用できます。
zsh> echo $((3.14 + 1))
4.14
他の方法では、expr
を使用できます
例:
$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
bash
では、 printf -v を使用して、あらゆるものから整数への変換を実行できます。
printf -v int '%d\n' "$1" 2>/dev/null
浮動小数点数は整数に変換されますが、数値のように見えないものはすべて0に変換されます。指数はe
の前の数値に切り捨てられます
例:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
LinuxとOSXの両方の環境で実行するbashスクリプトを開発するときに、最近同様の状況が発生しました。 OSXの1つのコマンドの結果が、結果コードを含む文字列を返しました。つまり、" 0"
。もちろん、これは次の場合には正しくテストできませんでした:
if [[ $targetCnt != 0 ]]; then...
解決策は、@ John1024が上記で答えたのと同様に、結果を整数に強制(つまり、「変換」)して、期待どおりに機能するようにすることでした。
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...