if条件の括弧:スペースなしで構文エラーが発生するのはなぜですか?

if条件の括弧:スペースなしで構文エラーが発生するのはなぜですか?

年の最初の2日間にスクリプトが実行されたら、次のスクリプトを使用して2日間後に移動し、毎月1日目と2日目を確認して2日後方に移動します。

if [$month="01"] && [$day="01"]; then
        date="$last_month/$yes_day/$last_year"
        fulldate="$last_month/$yes_day/$last_year"
else
        if [$month="01"] && [$day="02"]; then
                date="$last_month/$yes_day/$last_year"
                fulldate="$last_month/$yes_day/$last_year"
        else
                if [ $day = "01" ]; then
                        date="$last_month/$yes_day/$year"
                        fulldate="$year$last_month$yes_day"
                else
                        if [ $day = "02" ]; then
                                date="$last_month/$yes_day/$year"
                                fulldate="$year$last_month$yes_day"
                        else
                                date="$month/$yes_day/$year"
                                fulldate="$year$month$yes_day"
                        fi
                fi
        fi
fi

しかし、私の問題は、次のエラーメッセージが表示されます

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

ベストアンサー1

[はメタ文字でも制御演算子でもありません (予約語でもない、 と同じ])。したがって、周囲にスペースが必要です。それ以外の場合、シェルは別の引数、およびを持つコマンドの代わりにコマンドを「認識」します[01=01]。各演算子とオペランドはコマンドの別々の引数でなければならないため、演算子の周囲にもスペースが必要です。[01=01][

if [ "$month" = "01" ]

[$month="01"]$monthまたはのすべての文字に一致するワイルドカードパターン"01。何も一致しない場合はそのままにしてください。

閉じ括弧の後にセミコロンがある場合、セミコロンは常に別個のトークンの一部であるため、前にスペースは必要ありません。

if [ "$month" = "01" ]; then

bash(およびkshとzsh)の二重括弧構文にも同じことが当てはまります。

複数の条件

条件を結合する方法は2つあります。

  1. 以内に[

  2. 別のコマンドと[組み合わせる&&||

括弧でグループ化する方が簡単です[

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

最初のものは信頼できないため、避けるべきです(たとえば、使用したい場合month='!')。安全な文字列を最初に使用すると(可能であれば)、奇妙な変数の内容による問題を回避するか、[[/]]代わりに[/を使用してください]

if [ "01" = "$month" -a "01" = "$day" ]

おすすめ記事