web-dev-qa-db-ja.com

exprと変数

スクリプトの実行方法: _./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 "$@"_は機能します-_$@_を変数に割り当てたときに何が起こっているのか理解できません。

2
SantaXL

スクリプトが機能しない理由

スクリプトは現在、ワイルドカード拡張を実行して、ワイルドカードを現在の作業ディレクトリ内のすべてのファイルに置き換えます。これは、スクリプトの先頭に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オプションを使用してglobの展開を無効にします。

#!/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
2