論理

論理

どちらのオプションも機能しないようです。何が間違っているのでしょうか? ( leapbleapcおよび は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=1900leapc=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=1900iyr=1979(つまり等しくない) 最初のテストは失敗し、leap=0の値が何でleapcあっても は実行されません。

実行する唯一の方法leap=0は、leapb=iyrleapcないに等しい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空の文字列の場合。

ただし、この[[ ... ]]構文では、テストは暗黙的に失敗します。

関連記事:

関連情報