これらの違いは何でしょうか:
SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")
SEC=100
どちらも同じ結果 (100) を返します。ただし、次のようにテストすると、
if [ ${SEC} > 1 ]
then
echo "SEC GT 1"
else
echo "SEC LT 1"
fi
最初のものは以下を返します:
"SEC GT 1"
2番目は以下を返します:
"SEC LT 1"
ただし、次のように変更します。
if [ ${SEC} -gt 1 ]
結果は逆になります。
これはデータ型と関係があり、cast
同じ結果を得るにはどちらか一方が必要であると思われます。
ただ、現時点では、IF
毎回セクションを変更することを覚えておく必要があるため、テストが混乱しています。
答え1
もともと、[
は通常のコマンドとして実装されており、 と同一ですtest
が、[
末尾に追加の引数が必要であり、その引数は である必要があります]
。(これは現在でも通常のコマンドとして存在しますが、ほとんどのシェルには組み込みの引数もあります。) これは通常の解析の対象となる通常のコマンドであるため、引用符なしで数学演算子やを使用することはできません。 には<
リダイレクト演算子が含まれており、 と同等であり、コマンドの(空の)出力をというファイルにリダイレクトします。コマンドは、ほとんどの場合、ダッシュで始まる特殊オプションを作成する通常の規則に従います。つまり、ほとんどの演算子はダッシュで始まります。そのため、ファイルが読み取り可能かどうかをテストする、2 つのテストを「and」演算子で組み合わせる、と が等しいかどうかをテストする、などがあります。>
[ ${SEC} > 1 ]
[ ${SEC} ] >1
[
1
[
[ -r foo ]
[ -r foo -a -w bar ]
[ $x -eq $y ]
$x
$y
これらの古いシェル=
には、文字列の等価性 (演算子、ダッシュ文字規則から逸脱する数少ない演算子の 1 つ) はありましたが、文字列の順序付けはありませんでした¹。ただし、数値の比較 ([ $x -le $y ]
整数$x
が より小さいか等しいかをテストするなど) はありました。$y
この演算子セットには、数値の等価性 ( ) が含まれます。[ $x -eq $y ]
これは[ 010 -eq 8 ]
、先頭のゼロは数値が 8 進数であることを意味するためです。
Ksh は、構文 を導入しました。これは、[[ … ]]
現在では bash と zsh でも使用できます。[ … ]
通常のコマンドである とは異なり、[[ … ]]
はシェルのパーサーによって認識されるため、 や などの特殊文字を引用符なし(
で<
内部で使用できます (実際、引用符で囲んではなりません)。 および-lt
の仲間はすでに数値比較に使用でき、 は=
すでに文字列比較を行っていたため、<
および の仲間は文字列比較演算子になりました (辞書式順序¹)。したがって、たとえば、[ 9 -lt 10 ]
ですが[[ 10 < 9 ]]
。
¹文字列の順序付けは ユーティリティで利用できますexpr
。これは、expr
POSIX シェルの機能に含まれていない の数少ない使用法の 1 つです。ただし、 はexpr
文字列と数値の比較に同じ演算子を使用するため、expr 9 \< 10
は ではないことに注意してくださいexpr a9 \> a10
。²文字列がバイト文字列として解釈されるか、現在のロケールで文字列として解釈されるかは、シェルによって異なります
。