私は Bash でif
ステートメントを動かそうとしています( Ubuntu を使って):
#!/bin/bash
s1="hi"
s2="hi"
if ["$s1" == "$s2"]
then
echo match
fi
[["$s1" == "$s2"]]
を使用し、引用符の有無にかかわらず、=
、==
および-eq
を使用して、さまざまな形式のif
ステートメントを試してみましたが、それでも次のエラーが発生します。
[hi:コマンドが見つかりません
さまざまなサイトやチュートリアルを見てそれらをコピーしましたが、うまくいきません。何が悪いのでしょうか。
最終的に、$s1
に$s2
が含まれているかどうかを言いたいのですが、どうすればよいでしょうか。
私はちょうどスペースビットを解決しました..:/どのように私は含んでいると言うのですか?
私は試した
if [[ "$s1" == "*$s2*" ]]
しかしうまくいきませんでした。
文字列を比較するには、次のようにします。
if [ "$s1" == "$s2" ]
a
にb
が含まれる場合は、次のように使用します。
if [[ $s1 == *"$s2"* ]]
(そして、シンボルの間にスペースを入れるのを忘れないでください):
悪い:
if ["$s1" == "$s2"]
良い:
if [ "$s1" == "$s2" ]
スペースが必要です。
if [ "$s1" == "$s2" ]
あなたは、変数がこれを含むところで、 '['の符号と二重引用符の間にスペースを残すように注意するべきです:
if [ "$s1" == "$s2" ]; then
# ^ ^ ^ ^
echo match
fi
^
sは、あなたが残す必要がある空白スペースを示します。
私はこれを提案します:
if [ "$a" = "$b" ]
開閉括弧と変数の間の空白と '='記号を囲む空白に注意してください。
また、スクリプトのヘッダーにも注意してください。あなたが使うかどうかは同じではありません
#!/bin/bash
または
#!/bin/sh
これがソースです 。
私はお勧めします:
#!/bin/bash
s1="hi"
s2="hi"
if [ $s1 = $s2 ]
then
echo match
fi
二重引用符がなく、1つだけが等しい場合。
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
この質問はすでに素晴らしい答えを持っていますが、ここではシングルイコールとダブルイコールを使うことの間にわずかな混乱があるようです。
if [ "$s1" == "$s2" ]
主な違いは、どのスクリプト言語を使用しているかです。 bash を使用している場合は、スクリプトの先頭に#!/bin/bash
を含めて、スクリプトをfilename.bash
として保存します。 use bash filename.bash
を実行するには - ==
を使わなければなりません。
sh を使用している場合は#!/bin/sh
を使用して、スクリプトをfilename.sh
として保存します。 use sh filename.sh
を実行するために - そしてあなたは単一の=
を使わなければなりません。混ぜないでください。
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
現時点ではLinuxボックスにアクセスできませんが、[は実際にはプログラム(およびbashの組み込み)です。したがって、[と最初のパラメータの間にスペースを空ける必要があります。
また、文字列等価演算子は単一の=のように見えます。
これは答えよりも明確です。はい、手がかりはエラーメッセージにあります。
[hi:コマンドが見つかりません
これはあなたの "hi"が "["に連結されていることを示しています。
より伝統的なプログラミング言語とは異なり、Bashでは、 "["は、より明白な "ls"などのようなコマンドです。記号であるという理由だけでは扱われません。したがって、 "["と(置換)$ s1 「あなたの質問の中で互いに隣り合っているものは、(Bashにとっては正しいことですが)結合され、それからその位置にあるコマンドを見つけようとします。[hi - これはBashにとっては未知のことです。
Cや他のいくつかの言語では、 "["は別の "文字クラス"と見なされ、次の "hi"とは区別されません。
したがって、開始 "["の後にスペースが必要です。
純粋なBashがあり、test
がないバージョンで、本当に見苦しい場合は、次のことを試してください。
if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
echo match
fi
説明:( )
では、追加のサブシェルが開かれています。一致した場合は0で終了し、一致しなかった場合は$ s1で終了しようとします(エラーが発生します)。このエラーは/dev/null
に向けられています。
#!/bin/bash
s1="hi"
s2="hi"
if [ "x$s1" == "x$s2" ]
then
echo match
fi
内側に追加の文字列を追加すると、より安全になります。
単一行コマンドには他の表記法も使用できます。
[ "x$s1" == "x$s2" ] && echo match