どちらのオプションも機能しないようです。何が間違っているのでしょうか? ( leapb
、leapc
および はiyr
整数値です)
if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
leap=0
fi
あるいは、
if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
leap=0
fi
iyr=1979
これを、、を使用して実行するとleapb=1900
、leapc=1600
スクリプトはleap=0
行に到達せず、 というエラー メッセージが表示されます-eq: unary operator expected
。
答え1
コードの簡略版では次のようになります。
[[ $a -eq $b ]]
a
およびの値がb
文字列、空、または未設定であっても、エラーは発生しません。
の古いバージョン[[
は です[
が、これも適切に引用されています。
[ "$a" -eq "$b" ]
a
または内の値がb
文字列(または空/未設定)の場合にのみエラーが発生します。
./script: line 13: [: StringInsideA: integer expression expected
つまり、実際にテストしているコードは[
、ない変数展開を引用する(悪い考えです):
[ $a -eq $b ]
その場合、a
が空/未設定で、 にb
何らかの値がある場合 (またはその逆)、報告されるエラーは次のようになります。
./script: line 14: [: -eq: unary operator expected
結論:[[
テストのバージョンを使用してください (bash、ksh、zsh の場合)。
論理
報告する値について:
leapb=1900
とiyr=1979
(つまり等しくない) 最初のテストは失敗し、leap=0
の値が何でleapc
あっても は実行されません。
実行する唯一の方法leap=0
は、leapb=iyr
leapc
ないに等しいiyr
。
よりシンプル
閏年を検出するだけの場合は、次のようにします。
leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))
この式では、うるう年の場合は leap は 1 になり、それ以外の場合は 0 になります。
答え2
指定されたコードではエラーを再現できません。指定された値では、とが等しくないためbash
、コードは に到達しません。leap=0
$iyr
$leapb
ただし、次のように変更すると:
if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
leap=0
fi
すると、
[: -eq: unary operator expected
$leapb
空の文字列の場合。
ただし、この[[ ... ]]
構文では、テストは暗黙的に失敗します。
関連記事: