これらのオプションのどれも機能しないようです。私は何が間違っていましたか? (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
and値、文字列、空または設定されていない値にもエラーはありません。
以前のバージョン[[
はですが[
、それにもかかわらず正しく引用されました。
[ "$a" -eq "$b" ]
a
orの値が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 ) ))
この式では、うるう年の場合は1、それ以外の場合は0です。
答え2
bash
あなたのコードでエラーを再現することはできません。与えられた値に対して、コードはと等しくないleap=0
ため、その値に達しません。$iyr
$leapb
しかし、次のように修正すると:
if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
leap=0
fi
それからこれは生産されるでしょう
[: -eq: unary operator expected
if は$leapb
空の文字列です。
構文を使用すると、[[ ... ]]
テストは自動的に失敗します。
関連読書: