年の最初の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つあります。
以内に
[
別のコマンドと
[
組み合わせる&&
か||
括弧でグループ化する方が簡単です[
。
if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or
if [ "$month" = "01" ] && [ "$day" = "01" ]
最初のものは信頼できないため、避けるべきです(たとえば、使用したい場合month='!'
)。安全な文字列を最初に使用すると(可能であれば)、奇妙な変数の内容による問題を回避するか、[[
/]]
代わりに[
/を使用してください]
。
if [ "01" = "$month" -a "01" = "$day" ]