Reputation: 3036
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
This bash script gives me Bad substitution error on Ubuntu. Any help will be highly appreciated.
Upvotes: 256
Views: 565293
Reputation: 2016
In my case I was calling a command on the terminal that contained undefined environment variable.
node command.js -f ${SOME_VAR}/build/some.txt
When I defined the SOME_VAR
my problem got fixed.
Upvotes: 0
Reputation: 2906
In my case I eventually found I had a missing } for one of the environmental variables. ${model.a
should have been ${model}.a
The takeaway is that it may be a typo.
I am editing in vi on SCO 5.0.5 so please don't bash me for missing a syntax error.
Upvotes: 0
Reputation: 5147
I used #!bin/bash
as well tried all approaches like no line before or after #!bin/bash.
Then also tried using +x but still didn't work.
Finally i tried running the script ./script.sh
it worked fine.
#!/bin/bash
jobname="job_201312161447_0003"
jobname_post=${jobname:17}
root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts# sh jaru.sh
jaru.sh: 3: jaru.sh: Bad substitution
root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts# ./jaru.sh
root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts#
Upvotes: 0
Reputation: 2439
in my case (under ubuntu 18.04), I have mixed $( ${} )
that works fine:
BACKUPED_NB=$(ls ${HOST_BACKUP_DIR}*${CONTAINER_NAME}.backup.sql.gz | wc --lines)
full example here.
Upvotes: 0
Reputation: 79715
I was adding a dollar sign twice in an expression with curly braces in bash:
cp -r $PROJECT_NAME ${$PROJECT_NAME}2
instead of
cp -r $PROJECT_NAME ${PROJECT_NAME}2
Upvotes: 4
Reputation: 27470
Not relevant to your example, but you can also get the Bad substitution
error in Bash for any substitution syntax that Bash does not recognize. This could be:
bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
before Bash 4.4.If you have multiple substitutions in the same expression, Bash may not be very helpful in pinpointing the problematic expression. E.g.:
$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution
Upvotes: 7
Reputation: 1
Looks like "+x" causes problems:
root@raspi1:~# cat > /tmp/btest
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution
Upvotes: 0
Reputation: 11
I have found that this issue is either caused by the marked answer or you have a line or space before the bash declaration
Upvotes: 0
Reputation: 3739
Also, make sure you don't have an empty string for the first line of your script.
i.e. make sure #!/bin/bash
is the very first line of your script.
Upvotes: 8
Reputation: 7338
For others that arrive here, this exact message will also appear when using the env variable syntax for commands, for example ${which sh}
instead of the correct $(which sh)
Upvotes: 111
Reputation: 21
Both - bash or dash - work, but the syntax needs to be:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
Upvotes: 2
Reputation: 1239
I had the same problem. Make sure your script didnt have
#!/bin/sh
at the top of your script. Instead, you should add
#!/bin/bash
Upvotes: 123
Reputation: 5491
The default shell (/bin/sh
) under Ubuntu points to dash
, not bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
So if you chmod +x your_script_file.sh
and then run it with ./your_script_file.sh
, or if you run it with bash your_script_file.sh
, it should work fine.
Running it with sh your_script_file.sh
will not work because the hashbang line will be ignored and the script will be interpreted by dash
, which does not support that string substitution syntax.
Upvotes: 312
Reputation: 121427
Your script syntax is valid bash and good.
Possible causes for the failure:
Your bash
is not really bash but ksh
or some other shell which doesn't understand bash's parameter substitution. Because your script looks fine and works with bash.
Do ls -l /bin/bash
and check it's really bash and not sym-linked to some other shell.
If you do have bash on your system, then you may be executing your script the wrong way like: ksh script.sh
or sh script.sh
(and your default shell is not bash). Since you have proper shebang, if you have bash ./script.sh
or bash ./script.sh
should be fine.
Upvotes: 26
Reputation: 6442
Try running the script explicitly using bash command rather than just executing it as executable.
Upvotes: 12