私は「if then」ステートメントを書いていますが、それは奇妙な行動のようです。調べた後、これが私がやっていた比較の終了コードに該当することに気づきました。以下のコードスニペットで私が見つけたものを説明します。
ご覧のとおり
rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"
出力
es_num is 1
es_str is 0
-eq
終了状態とテスト構成の内部の違いを議論する文書(可能な限りPOSIX標準)はありますか?=
条件文を作成する際の注意点は何ですか?これに関するベストプラクティスは何ですか?
移植可能なコードは、Bashコード(私が使用しているコード)よりも優先されます。
ベストアンサー1
-eq
整数 n1 と n2 が代数的に等しい場合は真、そうでなければ偽です。
=
文字列 s1 と s2 が等しい場合は真、そうでなければ偽です。
したがって、-eq
整数を比較して=
文字列を比較します(これはいくつかの制限された整数のケースにも適用されます)。
しかし、構文の問題があります。次のようにする必要があります。
[ "$rc" = 0 ]
まさか
[ $rc=0 ]
[ "$rc" = 0 ]
しなければならないrc
0 ではないため、1 で終了します。
[ $rc=0 ]
文字列として扱うことができ、[
テスト構成に文字列がある場合はtrueと評価されるため、実際には0で終了する必要があります。
sh[
テストにはいくつかの違いがあります。
# leading 0
$ [ 01 -eq 1 ]; echo $?
0
# adjacent whitespace
$ [ ' 1' -eq 1 ]; echo $?
0
# negative 0 vs positive 0
$ [ 0 -eq -0 ]; echo $?
0
しかし、[[
bashでテストしてみると(上記のものを含む)、多くの違いがあります。
# base 8
$ [[ 032 -eq 26 ]]; echo $?
0
# Arithmetic expressions
$ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
0
# Base 64
$ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
0