web-dev-qa-db-ja.com

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
17
Kumar1

[はメタ文字でも制御演算子でもありません(予約語でさえありません。]でも同じです)。そのため、周囲に空白が必要です。そうでない場合、シェルはコマンド[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" ]
27
Hauke Laging

それを書く別の方法:

case $month:$day in
  (01:0[12])
    date="$last_month/$yes_day/$last_year"
    fulldate="$last_month/$yes_day/$last_year"
    ;;
  (*:0[12])
    date="$last_month/$yes_day/$year"
    fulldate="$year$last_month$yes_day"
    ;;
  (*)
    date="$month/$yes_day/$year"
    fulldate="$year$month$yes_day"
esac
4