0

特定の変数が配置されている場合にルールを設定しようとしていますが、誰かがここで欠落している wtf を特定できますか?

test.sh:

#!/bin/bash
args=($@)
if [ "$@" = "--cron" ]; then 
 echo "WORKS!";
    else echo "FAILS"
fi

の出力./test.sh:

./test.sh: line 3: [: =: unary operator expected
FAILS

しかし、実行する./test.sh --cronと動作し、WORKS出力されます。

4

3 に答える 3

3

これを行う正しい方法は、あなたがやろうとしていることによって少し異なります。最初の引数が--cronであるかどうかを確認する場合は、次を使用します。

if [ "$1" = "--cron" ]; then

唯一の引数が--cronであるかどうかを確認する場合は、次を使用します。

if [ "$*" = "--cron" ]; then

(これは"$*"、何かを行う正しい方法である非常に少数のケースの1つであることに注意してください。スペースで区切られたすべての引数に拡張されますが、解析の目的では1つの単語として扱われます。)

引数が--cronであるかどうかを確認する場合は、次を使用します

cronopt=false
for argument; do
    if [ "$argument" = "--cron" ]; then
        cronopt=true
        break    # note: if you are scanning the arguments for other things too, remove this
    fi
done
if $cronopt; then
    ...

ところで、この行を何に使用しているのかわかりませんargs=($@)が、引数を配列に格納する正しい方法はargs=("$@")、引用符で単語の分割やファイル名の拡張などを行わないようにすることです。引数を配列に入れます。

于 2012-09-16T03:08:11.830 に答える
1

これは機能するはずですが、最初の要素に対してのみ、引数を反復処理するためにfororループを実行する必要がある場合があります。while

#!/bin/bash
args=($1)
if [ $args ] && [ $args = "--cron" ]; then
  echo "WORKS!";
    else echo "FAILS"
fi
于 2012-09-16T01:33:55.947 に答える
0

この場合、"$@"引用が多すぎると思います。

と比較してみる"$1"か、次を使用します。

#!/bin/bash
args=($@)
if [ "$*" = "--cron" ]; then 
    echo "WORKS!";
else
    echo "FAILS"
fi
于 2012-09-16T02:04:31.910 に答える