内部文字列を比較するには、二重角if
かっこを使用する必要があることをお読みください。いくつかの本では、を通じて比較できると言います=
。ただし、これ==
にも当てはまります。
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
=
比較してみると、特に違いはありませんか==
?
答え1
bash
(その構文をコピーしたksh
場所と同様)、比較ではなくパターンマッチングです。バイト間同等比較を実行する必要があります。どんなサポートでも。bash
[[ $a == $b ]]
[[ $a == "$b" ]]
=
==
[[...]]
[[...]]
標準構文ではありませんsh
。これ[
注文する標準で標準です比較する演算子が存在します=
(一部の[
実装では1も認識しますが==
)。
すべてのコマンドの引数と同様に、変数拡張も引用符で囲む必要があります。分割+グローバル空の削除(後者のみで行われますzsh
)なので、次のようになります。
[ "$a" = "$b" ]
標準では、sh
パターンマッチングは次の方法で行われますcase
。
case $a in
($b) ...
esac
完全性のために平等シェルスクリプトで出会える演算子:
[ "$a" -eq "$b" ]
:[
10進整数を比較するための標準演算子です。一部[
の実装では、数字の周りにスペースを許可し、一部ではランダムな算術式を許可しますが、これは移植可能ではありません。ポータブルで人々が使用できます[ "$(($a))" -eq "$(($b))" ]
。[ "$((a == b))" -ne 0 ]
次の標準項目も参照してください(整数定数が含まれている$a
場合にのみ動作を指定するPOSIXlyを除く$b
)。((a == b))
zsh
と にある ksh の はbash
に格納された算術式が$a
と同じ結果で評価される場合 true を返します$b
。通常、数値を比較するために使用されます。算術式を評価する方法とサポートされている数には、シェルの間に違いがあります(例:bashとkshのいくつかの実装/バージョンは浮動小数点をサポートしないか、0の前の数字を8進数で処理しません)。expr "$a" = "$b"
両方のオペランドが10進整数として認識されている場合(一部は数字の周りに空白を許可する)、数値比較が実行され、そうでない場合、両方の文字列オペランドのソート順序が同じであることが確認されます。$a
OR$b
演算子の値にもexpr
失敗します(
...substr
awk -- 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
$a
:合計が数字として認識される$b
(最小10進整数および1.2、-1.5e-4などの浮動小数点、先行末尾のスペースは無視され、一部は16進数、8進数、または認識されるすべての数字も認識された場合の比較です。) 、かどうかと並べ替えが等しいかどうか。strtod()
expr
strcoll()
$a
$b
また見なさい:
[
1 GNUとの組み込み機能が含まれています。[
たとえすべてがシェルとに基づいているわけではありませんが、ksh
bash
yash
ash
zsh
zsh
=cmd
特殊ファイル名拡張演算子です。(同じコンテキストで拡張されます)はそのコマンドのパスに拡張されるため、機能を無効にするオプションをオフにしない限り、それを作成する必要があり~user
ます。そうしないと、コマンドが見つからないというエラーが発生します。以下にも適用されます。equals
[ "$a" '==' "$b" ]
=
[ "$string" '=~' "$regexp" ]
答え2
これはbashでも同じです:
[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]
最初の2つの$ x変数は引用符で囲む必要はありません。 Bashは[内でトークン化とパス名拡張を実行しますが、[[:内では実行しません。
$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$
[[ $x = "$y" ]]
文字列比較ですが、パターン[[ $x = $y ]]
一致式は次のとおりです。
$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0
-eq は整数でのみ動作します。
$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0
また、見ることができますBashFAQ/031:test、[、および[[の違いは何ですか?。
答え3
どちら=
もオペレータです==
。一部の言語(Cなど)では、1つは変数に値を割り当てるために使用され、もう1つは値(算術式の結果)を比較するために使用されます。実際、これら2つの演算子は算術評価に使用される演算子とまったく同じです。 A$((a=23))
は代入、a$((a==23))
は算術比較です。
$ echo "$((a=11)) $((a==23))" "$((a=23))" "$((a==23))"
11 0 23 1
しかし、テスト構造内では(すべてテストそして[… ]そして[[...]])両方の演算子は同じ意味を持ち、同じことを行います。
したがって、すべてのオプションは次のようになります。
test "$a" = "$b"
[ "$a" = "$b" ]
[[ "$a" = "$b" ]]
test "$a" == "$b"
[ "$a" == "$b" ]
[[ "$a" == "$b" ]]
はい内部等価物強く打つバイナリ同一性(参照変数)をテストします。正しい変数が引用されていない場合は、パターンとして解釈され、それに応じて一致することができます。つまり、リテラル文字列ではなくパターンに一致させることができます。
引用符付き演算子\=
とは\==
test で使用しても同じです[…]
。ただし、引用符付き演算子は\==
内部的に失敗します[[…]]
。
他のシェルの場合、結果はさまざまです。正しい結果はY -
(true false)でなければならず、0(true)および1(false)以外の終了コードはfailuresとして報告されます¤
。一部のシェルは失敗します- -
(終了コードは常に1です)。
| dash ksh bash zsh
test a = "$b" | Y - Y - Y - Y -
[ a = "$b" ] | Y - Y - Y - Y -
[[ a = "$b" ]] | ¤ ¤ Y - Y - Y -
test a == "$b" | ¤ ¤ Y - Y - - -
[ a == "$b" ] | ¤ ¤ Y - Y - - -
[[ a == "$b" ]] | ¤ ¤ Y - Y - Y -
test a \= "$b" | Y - Y - Y - Y -
[ a \= "$b" ] | Y - Y - Y - Y -
[[ a \= "$b" ]] | ¤ ¤ Y - - - - -
test a \== "$b" | ¤ ¤ Y - Y - Y -
[ a \== "$b" ] | ¤ ¤ Y - Y - Y -
[[ a \== "$b" ]] | ¤ ¤ Y - - - - -
すべてのオプションはkshで機能し、引用符付き演算子は[[…]]
bashとzsh(内部的に)で失敗し、引用符で囲まれていない演算子はzsh(外部的に)で失敗\=
します。\==
[[…]]