web-dev-qa-db-ja.com

Bashで文字列を比較する方法

変数と文字列を比較するにはどうすればよいですか(それらが一致する場合は何かをします)。

823
Erik Sapir

Ifステートメントで変数を使用する

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

一致しないときに何かしたい場合は、=!=に置き換えます。 文字列演算 および 算術演算 についての詳細は、それぞれのドキュメントで読むことができます。

$xを引用符で囲むのはなぜですか?

空の場合、bashスクリプトに以下のような構文エラーが発生するため、$xを囲む引用符が必要です。

if [ = "valid" ]; then

==演算子の非標準的な使い方

bash==[との等価性のために使うことを可能にしますが、 これは標準ではありません .

$xを囲む引用符がオプションである最初のケースを使用してください。

if [[ "$x" == "valid" ]]; then

または2番目のケースを使用します。

if [ "$x" = "valid" ]; then
1180
John Feminella

または、else句が不要な場合は、

[ "$x" == "valid" ] && echo "x has the value 'valid'"
125
Marko

文字列とワイルドカードを比較するには

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi
58
a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
Elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

ノート:

  1. if[]の間のスペースは重要です
  2. ><はリダイレクト演算子なので、文字列に対してはそれぞれ\>\<でエスケープします。
58
Guru

私は一点でコメントの1つに同意しない必要があります。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

いいえ、それはクレイジーonelinerではありません

それはちょうどそれが1つのように見える、うーん、初心者...

ある意味では、言語として一般的なパターンを使います。

そしてあなたが言語を学んだ後。

実際には、それは読んでうれしいです

これは単純な論理式であり、特別な部分が1つあります。それは論理演算子の遅延評価です。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

各部分は論理式です。最初のものは真か偽かもしれません、他の2つは常に真実です。

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

さて、それが評価されるとき、最初のものがチェックされます。それが偽であれば、論理の2番目のオペランド および &&の後には関係ありません。最初のものは真実ではないので、とにかく、それは最初のものであることはできず、2番目のものは真実であることはできません。
さて、この場合、論理の最初の側は または || falseですが、反対側(3番目の部分)が真であれば真実かもしれません。

したがって、3番目の部分が評価されます - 主に副作用としてメッセージを書くことです。 (trueの場合は0という結果になります。ここでは使用しません)

他のケースも似ていますが、もっと単純です - そして - 私は約束します!読みやすいです。
(私は持っていませんが、あごひげを生やしたUNIXのベテランであることは、これに非常に役立ちます。)

29
Volker Siegel

ユースケース/ esacも使えます

case "$string" in
 "$pattern" ) echo "found";;
esac
19
ghostdog74

次のスクリプトは、 "testonthis"という名前のファイルから1行ずつ読み取り、各行を単純な文字列、特殊文字を含む文字列、および正規表現と比較します。

bash内のスペースはとても重要です。だから以下がうまくいくでしょう

[ "$LINE" != "table_name" ] 

しかし、フォローはしません:

["$LINE" != "table_name"] 

そのまま使用してください。

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
12
Harshil

入力に有効なエントリがわずかしかない場合は、おそらく正規表現の一致を使用します。例えば。有効なアクションは "start"と "stop"だけです。

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

二重コンマを使って変数$ACTIONを小文字にしていることに注意してください。また、これはあまりにも古くなったbashバージョンでは動作しません。

10
steviethecat

Bash4 +の例注:単語にスペースなどが含まれていると、引用符を使用しないと問題が発生します。常にbash IMOで引用してください。

以下はBASH4 +の例です。

例1、文字列内の 'yes'をチェックします(大文字と小文字は区別されません)。

    if [[ "${str,,}" == *"yes"* ]] ;then

例2、文字列内の 'yes'をチェックします(大文字と小文字は区別されません)。

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

例3、文字列内の 'yes'をチェックします(大文字と小文字を区別):

     if [[ "${str}" == *"yes"* ]] ;then

例4、文字列内の 'yes'をチェックします(大文字と小文字を区別):

     if [[ "${str}" =~ "yes" ]] ;then

例5、完全一致(大文字と小文字を区別):

     if [[ "${str}" == "yes" ]] ;then

例6、完全一致(大文字と小文字は区別されません):

     if [[ "${str,,}" == "yes" ]] ;then

例7、完全一致

     if [ "$a" = "$b" ] ;then

楽しい。

6
Mike Q

私はこのようにして、bash、dash(sh)と互換性があるようにしました。

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac
1
shades3002