テスト構造の比較終了状態

テスト構造の比較終了状態

私は「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 ] しなければならないrc0 ではないため、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

答え2

-eq数値比較では、文字列比較にはwhileを使用する必要があります=(変数の命名を既に知っているようです)。

私が知っているakaコマンドの最良の紹介の1つtestは次のとおりです。[Unixシェルの謙虚なif

関連情報