bashでの文字列比較。[[: 見つかりません


165

私はbashで文字列を比較しようとしています。私はすでにstackoverflowでそれを行う方法についての答えを見つけました。私が試しているスクリプトでは、前述の質問でAdamから送信されたコードを使用しています。

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

2番目の投稿で見つけることができるubuntuforumsからのアプローチも試しました

if [[ $var =~ regexp ]]; then
  #do something
fi

どちらの場合もエラーが発生します。

[[: not found

何が悪いのですか?


私はそれを間違っているかもしれませんが、単一の角括弧を使用することは常に私のために働きました。
Markus Unterwaditzer

1
何を/bin/bash --version印刷しますか?
themel 2012

4
[パターンをサポートしていないため、この場合は機能しません。
Ansgar Wiechers 2012

回答:


157

[[bash-builtinです。あなた/bin/bashは実際のバッシュではないようです。

コメントから:

#!/bin/bashファイルの先頭に追加


入力した場合:type '[[' i get [[is a shell keyword
user1581900

5
実行しても同じ結果が得られます/bin/bash -c "type [["か?
Ansgar Wiechers

43
これ#!/bin/bashは私がファイルの先頭に追加するのを忘れたために起こりました
モーフィック2017年

12
shがを使ってスクリプトを実行したので、私に問題が発生しました。今、私はこの答えを見つける前に、取り消したすべてをやり直す必要があります。
Louis Loudog Trottier、2018

174

スクリプトをどのように実行していますか?あなたがした場合

$ sh myscript

試してみてください:

$ bash myscript

または、スクリプトが実行可能な場合:

$ ./myscript

shbashは2つの異なるシェルです。最初のケースでは、スクリプトを引数としてshインタープリターに渡しますが、2番目のケースでは、使用するインタープリターの最初の行を決定します。


私はこの方法で拒否された許可を得ました。sudo ./myscriptを使用すると、コマンドが見つかりません
user1581900

11
やるのchmod + XのMyScriptを、再度実行して、あなたはsudoを必要としない
アコス・K

2
スクリプトを呼び出す方法を教えてください。
Akos K

あなたが言ったように。通常は「$ sh myscipt.sh」で呼び出します。chmod + x myscript.shを実行した後、2回目に./myscript.shで呼び出しました
user1581900

5
を介してスクリプトを実行すると、エラーが予想されます。これは、が組み込まれていないBourneシェルをエミュレートするsh myscript.shためです。ただし、スクリプトを実行してもエラーは発生しません。その場合、シバンが使用されるためです。/bin/sh[[./script.sh/bin/bash
Ansgar Wiechers 2012

81

スクリプトの最初の行です:

#!/bin/bash

または

#!/bin/sh

shシェルは、bashではなくこのエラーメッセージを生成します。


1
著者が述べたエラーを生成するために、最初の行も欠落していた!
匿名

14

Heroku Toolbeltのインストール時にこの問題が発生しました

これは私が問題を解決した方法です

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

ご覧のとおり、/ bin / shは「ダッシュ」(bashではない)へのリンクであり、[[bashの構文上の甘さです。したがって、私は/ bin / bashへのリンクを置き換えました。このようなrmをシステムで慎重に使用してください!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
shディストリビューションのデフォルトを上書きすることは、賢明ではない私見です。で実行されるシェルはで動作するshはずdashです。そうでない場合、それはスクリプトのバグです。bash機能が必要な場合は、bashではなくを使用してくださいsh
Tripleee、

4
これはひどいtbhに聞こえます
MrVaykadji

2
私は同意します、それは単に醜い回避策でした。同様の、しかしより良い回避策はupdate-alternativesjustinconover.wordpress.com / 2012/05/14 /…のように(debian-based-linuxで)使用することですが、最終的には同じです。
jperelli

13

@Ansgarが述べたように[[、bashismはBashに組み込まれており、他のシェルでは使用できません。スクリプトを移植可能にする場合は、を使用します[。比較はまた、異なる構文が必要になります。変更==するに=


Ubuntu 16.04と(sh->)ダッシュ0.5.8-2.1ubuntu2で少しチェックし、[が "-eq"などと組み合わせてうまく機能することを確認しました。このコンテキストの比較演算子の同様の情報はここで見つけることができます:stackoverflow.com/questions/10849297/...を -次のリンクで推奨されているように私は、さらに(())の評価演算子でchekedが、それは私の最小限の侵襲的変化のために失敗するように見えました/または、コードを大幅に変更する必要があります。softpanorama.org/Scripting/Shellorama/Control_structures/...
アレクサンダーStohr

3

スクリプトの実行時に、shではなくbashを指定します。私は個人的に、それらがubuntu 12.10では異なることに気づきました:

bash script.sh arg0 ... argn


これで解決しました!
Djamillah 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.