Linux Script Error: Bad Substitution (change shell from dash to bash)

Published by Torry Crass on

This is a simple problem in the end that cost me serious troubleshooting time. Hopefully you found this article and it can save you some of what I lost.

You may encounter a problem when running a script on the Linux CLI that results in error: bad substitution and a failed script run.

This may be due to your distro using dash as the shell instead of bash and more importantly, that sh may link to dash which can mess you up further.

First check on your shell with: echo $SHELL which will display your current users shell. If this shows bash you’re likely okay there, if it does not, then you may need to update your user’s shell by issuing a command like usermod --shell /bin/bash <username>.

Next, if your last check was okay, you need to find out where sh is pointing so run readlink -f $(which sh) or ls -al /bin/sh either should give you the information you need.

If you find that the previous results show some form of path to dash then you may need to update it. Especially if it is a symlink (which it probably is) that shows something like this:

root@server:~# ls -al /bin/sh
lrwxrwxrwx 1 root root 4 Oct 26 01:39 /bin/sh -> dash

If you see the above symlink you’re likely going to have to manually delete and recreate the symlink pointing to bash as follows (remember to use sudo if you are not running the command as root):

rm /bin/sh
ln -s /bin/bash /bin/sh

Once you’ve knocked this out your scripts should once again run as expected.


Leave a Reply