
スクリプトをどのように実行しますか? ./script.sh 1 \* 2
最後に:./script.sh 1 '*' 2
私のスクリプトは次のとおりです。
args="$@" # the first line of the script
result=$(($args))
echo "$args = $result"
有効ですか?:はい
私が達成したいもの:expr
代わりに使用したい$((...))
それは次のとおりです。
args="$@" # the first line of the script
result=`expr $args`
echo "$args = $result"
などの入力パラメータには正しく機能しますが、1 + 2
アスタリスク(アスタリスク)記号(または)には正しく機能しません。expr: syntax error
なぜこれが期待どおりに機能しないのか、どのように解決するのかを知りたいです。
次のスクリプトは機能します。変数に割り当てるときに何が起こるのかexpr "$@"
わかりません。$@
答え1
スクリプトが機能しない理由
スクリプトはワイルドカード拡張を実行して、ワイルドカード文字を現在の作業ディレクトリ内のすべてのファイルに置き換えます。スクリプトの上部にオプションを追加すると、set -x
これは明らかになります。
$ ./expr_script.sh 2 '*' 2
+ args='2 * 2'
++ expr 2 -23.txt add_location_name.py expr_script.sh kusalananda 'Movie A (2014)' 'Movie B (2016)' one.test popup_script.sh somefile2.txt somefile.txt somethings texts three.test turnSignal.v two.test 2
expr: syntax error
+ result=
+ echo '2 * 2 = '
2 * 2 =
それを修正する方法
算術スクリプトでファイル名を拡張する必要がないため、set -f
グローバル拡張を無効にするオプションを使用できます。
#!/bin/bash
set -f
##set -x
args="$@" # the first line of the script
result=$(expr $args)
echo "$args = $result"
これは働きます:
$ ./expr_script.sh 2 '*' 2
2 * 2 = 4