SH、平等はできない

SH、平等はできない

単純なifステートメントを操作しようとしています。

if [ $sip1 = 0 ] ; then do stuff ; fi

私のサブラインには、sh私が経験している困難が表示されます。

整数として保存しているゼロを認識できません。文字列と比較すると一致しないことがわかります。

# if [ `expr $sip1` ] ; then echo hi
> fi
hi
# if [ `expr $sip1 = 1` ] ; then echo hi; fi
hi
# if [ `expr $sip1 = 2` ] ; then echo hi; fi
hi
# expr $sip1
0
# if [ `expr $sip1 + 0 = 2` ] ; echo hi
>
# if [ `expr $sip1 + 0 = 2` ] ; then echo hi
> fi
expr: non-numeric argument
# echo $sip1
0
# if [ $sip1 = "0" ] ; then echo hi ; fi
# if [ $sip1 = '0' ] ; then echo hi ; fi
# echo ">$sip1<"
<0

ベストアンサー1

あなたが投稿したものecho

# echo ">$sip1<"
<0

予想されるように、インジケータ変数の値の後にはキャリッジリターン文字(Bash構文)はsip1続きません。00$'0\r'

$ zero_cr=$'0\r'
$ if [ "$zero_cr" = "0" ] ; then echo hi ; fi
$ zero='0'
$ if [ "$zero" = "0" ] ; then echo hi ; fi
hi
## Or, using the proper numeric equality operator:
$ if [ "$zero" -eq "0" ] ; then echo hi ; fi
hi

変数を埋める方法に応じて、変数からキャリッジリターンを削除することをお勧めします。

  • sip1=$(command...)コードが次のようになると、sip1=$(command... | tr -d '\r')誤ったキャリッジリターンが削除され、テストが成功するはずです。

  • あるいは、Bash を仮定すると、後続のキャリッジリターンを削除することは構文を使用して機能するように見える${foo%$'\r'}ためsip1=${sip1%$'\r'}、変数から後続のキャリッジリターンをクリアする必要があります。

おすすめ記事