205

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

私は何を間違っていますか?

4

8 に答える 8

225

[[はbashビルトインです。あなた/bin/bashは実際のバッシュではないようです。

コメントから:

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

于 2012-09-01T19:27:45.577 に答える
204

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

$ sh myscript

試してみてください:

$ bash myscript

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

$ ./myscript

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

于 2012-09-01T19:32:08.447 に答える
85

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

#!/bin/bash

また

#!/bin/sh

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

于 2013-05-06T16:58:25.533 に答える
18

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

于 2016-05-30T14:55:26.843 に答える
17

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

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

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

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

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
于 2013-07-19T18:28:40.587 に答える