Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash 'source': syntax error near unexpected token `then'

Tags:

bash

I have a simple bash script:

#!/bin/bash

if [ -n "abcd" ]; then
    echo "a non-empty string"
else
    echo "an empty string"
fi

The script runs fine:

$ bash test.sh
non-empty string

But when I try to source it, a strange error message is produced:

$ source test.sh
bash: ./test.sh: line 3: syntax error near unexpected token `then'
bash: ./test.sh: line 3: `if [ -n "abcd" ]; then

Any advice welcome. The problem appears with any script containing the if command, including Fedora's /etc/bashrc and my other scripts.

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
like image 631
peter.slizik Avatar asked Apr 21 '26 11:04

peter.slizik


1 Answers

Such an error would occur if a command includes the then shell keyword without a corresponding if keyword.

If the word if was used to define an alias, the alias would be expanded before Bash parses your commands, resulting in such an error. This can be checked by running type -a if. If it has been aliased, you’ll see output similar to

if is aliased to <some command>
if is a shell keyword

The problem can then be resolved by running unalias if to remove the alias.

When running bash test.sh, the new shell is non-interactive and by default, Bash only expands aliases for interactive shells. Running source test.sh means the commands in the file were interpreted in your current (interactive) shell and the problematic alias was expanded.

For future reference, if there are problems in an interactive shell, but not in non-interactive shells, it’s worth running alias to check which aliases have been defined.

like image 68
Anthony Geoghegan Avatar answered May 05 '26 08:05

Anthony Geoghegan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!