web-dev-qa-db-ja.com

引数文字列をbashの整数に

引数を整数に変換して算術演算を実行する方法を理解し、それを出力しようとしています。たとえば、addOne.sh

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
89
user135986

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
104
John1024

他の方法では、exprを使用できます

例:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
17
Nam

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
11
cuonglm

LinuxとOSXの両方の環境で実行するbashスクリプトを開発するときに、最近同様の状況が発生しました。 OSXの1つのコマンドの結果が、結果コードを含む文字列を返しました。つまり、" 0"。もちろん、これは次の場合には正しくテストできませんでした:

if [[ $targetCnt != 0 ]]; then...

解決策は、@ John1024が上記で答えたのと同様に、結果を整数に強制(つまり、「変換」)して、期待どおりに機能するようにすることでした。

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
9
JESii