#!/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.
#!/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.
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.
bad substitution
and I'm just trying to gather information but this question doesn't help because it has too few information. –
Sunset zsh
:facepalm: –
Tubercular 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
#!bin/bash
and sh script.sh
, it still gave me the error message. Then ./script.sh
works. –
Revivalism #!/bin/bash
will also fix the Bad substitution. –
Chiu #!
line is used only when you execute your script directly. If you use sh script.sh
the line is completely ignored. –
Meetly 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)
{
vs normal bracket (
(took me a little time to figure out what you were showing) –
Dichloride 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.
/bin/bash
(not /bin/sh
) were ever linked to a different shell. –
Bodleian Try running the script explicitly using bash command rather than just executing it as executable.
sh script
and bash script
... my suggestion :) –
Meristic 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.
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
Bad substitution
so I thought I'd include the case that we ran into. (It was @Q
in Bash 4.3 hiding in a long multi-line expression.) –
Fruition @Q
being added in bash-4.4
. –
Bedim 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
Both - bash or dash - work, but the syntax needs to be:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
I have found that this issue is either caused by the marked answer or you have a line or space before the bash declaration
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
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.
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#
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.
© 2022 - 2025 — McMap. All rights reserved.
cut
?cut -d_ -f1,2 <<< "$jobname"
andcut -d_ -f3 <<< "$jobname"
make it – Meristicsh script.sh
it gets a "Bad substitution" error. – Meristichttp://askubuntu.com/questions/571852/alternatives-for-variable-string-substitution-in-bash
– Lactate