ロジック

ロジック

これらのオプションのどれも機能しないようです。私は何が間違っていましたか? (leapbおよびleapciyr整数値です)

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 ]]

aband値、文字列、空または設定されていない値にもエラーはありません。

以前のバージョン[[はですが[、それにもかかわらず正しく引用されました。

[ "$a" -eq "$b" ]

aorの値が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=0leapb=iyrleapcいいえ同じ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空の文字列です。

構文を使用すると、[[ ... ]]テストは自動的に失敗します。

関連読書:

関連情報