web-dev-qa-db-ja.com

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

Bashの文字列を比較しようとしています。 stackoverflow でそれを行う方法についての答えをすでに見つけました。私が試みているスクリプトでは、言及された質問でアダムによって提出されたコードを使用しています:

#!/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

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

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

どちらの場合でも、エラーが表示されます。

[[: not found

何が間違っていますか?

126
user1581900

[[はbash組み込みです。 /bin/bashは実際のbashではないようです。

112
Ansgar Wiechers

スクリプトの実行方法は?あなたがやったなら

$ sh myscript

試してみてください:

$ bash myscript

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

$ ./myscript

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

141
Akos K

スクリプトの最初の行は次のとおりです。

#!/bin/bash

または

#!/bin/sh

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

72
Wiley

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

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

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

ご覧のとおり、/ bin/shは「bash」ではなく「dash」へのリンクであり、[[はbashの構文上の糖度です。そこで、リンクを/ bin/bashに置き換えました。 システムでこのようなrmを使用する場合は注意してください!

$ Sudo rm /bin/sh
$ Sudo ln -s /bin/bash /bin/sh
14
jperelli

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

8

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

bash script.sh arg0 ... argn

3
Smeterlink