2011-06-29 8 views
4

スクリプトがスクリプトが任意のパラメータなしで実行し得るとき、それは

./script.sh: line 4: [: ==: unary operator expected 

ことが、その後

if [ "$1" == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

代わりに、もしすべての罰金

を文句を言うでしょう

if [ $1 == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

を持っている場合何故ですか?

おかげ

答えて

5

は、あなたの最初のスクリプトが評価された:構文エラーがある

if [ == "-?" ] ; then 

...。あなたが""を利用するために必要なことを防ぐために、気づいたとして、それがあると評価:

if [ "" == "-?" ] ; then 

私の知る限り、これはオリジナルのBourneシェルが働いていた方法が原因です。 ""で変数を囲む習慣にすることで、スペースを含む引数でも正しく動作するようにする必要があります。たとえば、あなたがこのようにスクリプトを呼び出すかどう:も構文エラーです

if [ first argument has spaces == "-?" ] ; then 

./myScript "first argument has spaces" 

は、その後、あなたの最初のスクリプトは、と評価されてしまうからです。 rm $1のようなものは、ファイル名にスペースを渡すと、あなたが望むことはできません。代わりにrm "$1"してください。

5

[を実行する前に値を置き換えているため。 [[は、期待どおりに動作しません。最初の引数が見つからないか、空の場合