Arindam Choudhury
Arindam Choudhury

Reputation: 3036

bash: Bad Substitution

#!/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

Answers (15)

AminSojoudi
AminSojoudi

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

spemble
spemble

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

prashant thakre
prashant thakre

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

bcag2
bcag2

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

sashoalm
sashoalm

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

Daniel Darabos
Daniel Darabos

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:

  • Stray whitespace. E.g. bash -c '${x }'
  • A typo. E.g. bash -c '${x;-}'
  • A feature that was added in a later Bash version. E.g. 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

Andrew Knutsen
Andrew Knutsen

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

Ahmed Oladele
Ahmed Oladele

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

wizurd
wizurd

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

Nacho Coloma
Nacho Coloma

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

Hagen
Hagen

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

Guest
Guest

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

Vanni Totaro
Vanni Totaro

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

P.P
P.P

Reputation: 121427

Your script syntax is valid bash and good.

Possible causes for the failure:

  1. 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.

  2. 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

Ravindra S
Ravindra S

Reputation: 6442

Try running the script explicitly using bash command rather than just executing it as executable.

Upvotes: 12

Related Questions