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
何が間違っていますか?
[[
はbash組み込みです。 /bin/bash
は実際のbashではないようです。
スクリプトの実行方法は?あなたがやったなら
$ sh myscript
試してみてください:
$ bash myscript
または、スクリプトが実行可能な場合:
$ ./myscript
shとbashは2つの 異なるシェル 。最初のケースでは、スクリプトを引数としてshインタープリターに渡しますが、2番目のケースでは、最初の行でどのインタープリターを使用するかを決定します。
スクリプトの最初の行は次のとおりです。
#!/bin/bash
または
#!/bin/sh
shシェルは、bashではなくこのエラーメッセージを生成します
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
@Ansgarが述べたように、[[
はbashismです。つまり、Bashに組み込まれ、他のシェルでは使用できません。スクリプトを移植可能にする場合は、[
を使用します。比較には別の構文も必要になります:==
を=
に変更します。
スクリプトの実行時にshではなくbashを指定します。私は個人的に、ubuntu 12.10では異なることに気付きました:
bash script.sh arg0 ... argn