web-dev-qa-db-ja.com

Bashの 'if'ステートメントで2つの文字列変数を比較するにはどうすればいいですか?

私は Bashifステートメントを動かそうとしています( Ubuntu を使って):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

[["$s1" == "$s2"]]を使用し、引用符の有無にかかわらず、===および-eqを使用して、さまざまな形式のifステートメントを試してみましたが、それでも次のエラーが発生します。

[hi:コマンドが見つかりません

さまざまなサイトやチュートリアルを見てそれらをコピーしましたが、うまくいきません。何が悪いのでしょうか。

最終的に、$s1$s2が含まれているかどうかを言いたいのですが、どうすればよいでしょうか。

私はちょうどスペースビットを解決しました..:/どのように私は含んでいると言うのですか?

私は試した

if [[ "$s1" == "*$s2*" ]]

しかしうまくいきませんでした。

531
Mr Shoubs

文字列を比較するには、次のようにします。

if [ "$s1" == "$s2" ]

abが含まれる場合は、次のように使用します。

if [[ $s1 == *"$s2"* ]]

(そして、シンボルの間にスペースを入れるのを忘れないでください):

悪い:

if ["$s1" == "$s2"]

良い:

if [ "$s1" == "$s2" ]
739
marcog

スペースが必要です。

if [ "$s1" == "$s2" ]
149
unwind

あなたは、変数がこれを含むところで、 '['の符号と二重引用符の間にスペースを残すように注意するべきです:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

^sは、あなたが残す必要がある空白スペースを示します。

130
trejo08

私はこれを提案します:

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

開閉括弧と変数の間の空白と '='記号を囲む空白に注意してください。

また、スクリプトのヘッダーにも注意してください。あなたが使うかどうかは同じではありません

#!/bin/bash

または

#!/bin/sh

これがソースです

31

私はお勧めします:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

二重引用符がなく、1つだけが等しい場合。

15
jzrk

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
13
Mike Q

この質問はすでに素晴らしい答えを持っていますが、ここではシングルイコールとダブルイコールを使うことの間にわずかな混乱があるようです。

if [ "$s1" == "$s2" ]

主な違いは、どのスクリプト言語を使用しているかです。 bash を使用している場合は、スクリプトの先頭に#!/bin/bashを含めて、スクリプトをfilename.bashとして保存します。 use bash filename.bashを実行するには - ==を使わなければなりません。

sh を使用している場合は#!/bin/shを使用して、スクリプトをfilename.shとして保存します。 use sh filename.shを実行するために - そしてあなたは単一の=を使わなければなりません。混ぜないでください。

12
Rahul Dahiya
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
8
qwerty

現時点ではLinuxボックスにアクセスできませんが、[は実際にはプログラム(およびbashの組み込み)です。したがって、[と最初のパラメータの間にスペースを空ける必要があります。

また、文字列等価演算子は単一の=のように見えます。

6
Mrki

これは答えよりも明確です。はい、手がかりはエラーメッセージにあります。

[hi:コマンドが見つかりません

これはあなたの "hi"が "["に連結されていることを示しています。

より伝統的なプログラミング言語とは異なり、Bashでは、 "["は、より明白な "ls"などのようなコマンドです。記号であるという理由だけでは扱われません。したがって、 "["と(置換)$ s1 「あなたの質問の中で互いに隣り合っているものは、(Bashにとっては正しいことですが)結合され、それからその位置にあるコマンドを見つけようとします。[hi - これはBashにとっては未知のことです。

Cや他のいくつかの言語では、 "["は別の "文字クラス"と見なされ、次の "hi"とは区別されません。

したがって、開始 "["の後にスペースが必要です。

5
MikeW

純粋なBashがあり、testがないバージョンで、本当に見苦しい場合は、次のことを試してください。

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

説明:( )では、追加のサブシェルが開かれています。一致した場合は0で終了し、一致しなかった場合は$ s1で終了しようとします(エラーが発生します)。このエラーは/dev/nullに向けられています。

2
user2546460
#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

内側に追加の文字列を追加すると、より安全になります。

単一行コマンドには他の表記法も使用できます。

[ "x$s1" == "x$s2" ] && echo match
2
mpapis