単純な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
続きません。0
0
$'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'}
、変数から後続のキャリッジリターンをクリアする必要があります。