Ich versuche, Strings in Bash zu vergleichen. Ich habe bereits eine Antwort gefunden, wie es beim Stackoverflow geht . In dem Skript, das ich versuche, verwende ich den von Adam in der genannten Frage eingereichten Code:
#!/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
Ich habe auch versucht, Ansatz von Ubuntuforums , die Sie im 2. Beitrag finden können
if [[ $var =~ regexp ]]; then
#do something
fi
In beiden Fällen erhalte ich folgende Fehlermeldung:
[[: not found
Was mache ich falsch?
bash
shell
ubuntu-11.04
string-comparison
user1581900
quelle
quelle
/bin/bash --version
druckt?[
funktioniert in diesem Fall nicht, da es keine Muster unterstützt.Antworten:
[[
ist ein Bash-Builtin. Ihr/bin/bash
scheint kein wirklicher Schlag zu sein.quelle
/bin/bash -c "type [["
?#!/bin/bash
oben in meiner Dateish
viel Frust ausgeführt habe. Jetzt muss ich nur noch alles wiederholen, was ich gelöst habe, bevor ich diese Antwort finde.Wie führen Sie Ihr Skript aus? Wenn du es getan hast
du solltest es versuchen:
oder, wenn das Skript ausführbar ist:
sh und bash sind zwei verschiedene Muscheln . Während Sie im ersten Fall Ihr Skript als Argument an den sh-Interpreter übergeben, entscheiden Sie im zweiten Fall in der ersten Zeile, welcher Interpreter verwendet wird.
quelle
sh myscript.sh
, da/bin/sh
eine Bourne-Shell emuliert wird, in der[[
es sich nicht um eine integrierte Shell handelt. Das Ausführen des Skripts über./script.sh
sollte jedoch keinen Fehler ergeben, da in diesem Fall der Shebang die Verwendung veranlassen/bin/bash
sollte.Ist die erste Zeile in Ihrem Skript:
oder
Die sh-Shell erzeugt diese Fehlermeldungen, nicht bash
quelle
Ich hatte dieses Problem bei der Installation von Heroku Toolbelt
So habe ich das Problem gelöst
Wie Sie sehen können, ist / bin / sh ein Link zu "dash" (nicht bash) und
[[
ist bash syntaktischer Zucker. Also habe ich gerade den Link zu / bin / bash ersetzt. Vorsichtig mit rm wie diesem in Ihrem System!quelle
sh
für Ihre Distribution ist meiner Meinung nach nicht ratsam. Eine Shell, mit der ausgeführt wird,sh
sollte funktionierendash
. Wenn nicht, ist das ein Fehler im Skript. Wenn Siebash
Funktionen benötigen , verwenden Siebash
nichtsh
.update-alternatives
(unter Debian-basiertem Linux) wie dieses justinconover.wordpress.com/2012/05/14/…, aber am Ende wäre es dasselbe.Wie @Ansgar erwähnte,
[[
handelt es sich um einen Bashismus, der in Bash eingebaut ist und für andere Shells nicht verfügbar ist. Wenn Sie möchten, dass Ihr Skript portabel ist, verwenden Sie[
. Vergleiche benötigen auch eine andere Syntax: Ändern Sie==
zu=
.quelle
Geben Sie beim Ausführen des Skripts bash anstelle von sh an. Mir persönlich ist aufgefallen, dass sie unter Ubuntu 12.10 unterschiedlich sind:
bash script.sh arg0 ... argn
quelle