以下のスクリプトを使用して、スクリプトが年の初めの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
[
はメタ文字でも制御演算子でもありません(予約語でさえありません。]
でも同じです)。そのため、周囲に空白が必要です。そうでない場合、シェルはコマンド[01=01]
ではなくコマンド[
を別のパラメーター01
、=
、01
、および]
で「認識」します。 。各演算子とオペランドは[
コマンドへの個別の引数である必要があるため、演算子の前後にも空白が必要です。
if [ "$month" = "01" ]
[$month="01"]
は、$month
または"01
のいずれかの文字に一致するワイルドカードパターンです。何も一致しない場合は、そのままになります。
閉じ括弧の後にセミコロンがある場合、セミコロンは常に別のトークンの一部であるため、その前にスペースは必要ありません。
if [ "$month" = "01" ]; then
同じことがbash(およびkshとzsh)のダブルブラケット構文にも当てはまります。
条件を組み合わせる方法は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" ]
それを書く別の方法:
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