I am trying to compare strings in bash. I already found an answer on how to do it on stackoverflow. In script I am trying, I am using the code submitted by Adam in the mentioned question:
#!/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
I also tried approach from ubuntuforums that you can find in 2nd post
if [[ $var =~ regexp ]]; then
#do something
fi
In both cases I receive error:
[[: not found
What am I doing wrong?
/bin/bash --version
print?
[
won't work in this case, because it doesn't support patterns.
[[
is a bash-builtin. Your /bin/bash
doesn't seem to be an actual bash.
From a comment:
Add #!/bin/bash
at the top of file
How you are running your script? If you did with
$ sh myscript
you should try:
$ bash myscript
or, if the script is executable:
$ ./myscript
sh and bash are two different shells. While in the first case you are passing your script as an argument to the sh interpreter, in the second case you decide on the very first line which interpreter will be used.
sh myscript.sh
, because /bin/sh
emulates a Bourne shell where [[
is not a builtin. However, running the script via ./script.sh
should not yield an error, because in that case the shebang should cause /bin/bash
to be used.
Is the first line in your script:
#!/bin/bash
or
#!/bin/sh
the sh shell produces this error messages, not bash
As @Ansgar mentioned, [[
is a bashism, ie built into Bash and not available for other shells. If you want your script to be portable, use [
. Comparisons will also need a different syntax: change ==
to =
.
if [ $MYVAR = "myvalue" ]; then
echo "true"
else
echo "false"
fi
I had this problem when installing Heroku Toolbelt
This is how I solved the problem
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash
As you can see, /bin/sh is a link to "dash" (not bash), and [[
is bash syntactic sugarness. So I just replaced the link to /bin/bash. Careful using rm like this in your system!
$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
sh
for your distro is ill-advised IMHO. A shell which is run with sh
should work with dash
; if it doesn't, that's a bug in the script. If you need bash
features, use bash
, not sh
.
update-alternatives
(in debian-based-linux) like this justinconover.wordpress.com/2012/05/14/… but in the end, it would be the same.
If you know you're on bash, and still get this error, make sure you write the if with spaces.
[[1==1]] # This outputs error
[[ 1==1 ]] # OK
Specify bash instead of sh when running the script. I personally noticed they are different under ubuntu 12.10:
bash script.sh arg0 ... argn
Execute in your terminal:
sudo update-alternatives --install /bin/sh sh /bin/bash 100
Success story sharing
/bin/bash -c "type [["
?#!/bin/bash
at the top of my filesh
, lots for frustration. Now i just have to redo everything i undid before finding this answer.