Dragan
Dragan

Reputation: 455

bash syntax error in OSX

The following bash script, written and tested on Linux, does not even start on OS X when called.

#!/bin/bash
#
#   Some comments
#
#
function usage {
    echo ""
    echo "Usage: thisscript <SOURCE_DIRECTORY> <TARGET_DIRECTORY>"
    echo ""
    echo "<SOURCE_DIRECTORY>    the directory where the this "
    echo "              directory resides (default is /usr/dis)"
    echo ""
    echo "<TARGET_DIRECTORY>    the destination directory"
    echo ""
}

function notDarwin {
    mv -f $CUR_DIR/* $NEW_DIR/
    ln -sf "$NEW_DIR/ee/sc/scrp" "/usr/bin/scrp"
    ln -sf "$NEW_DIR/ee/etc/conffile.conf" "/etc/conffile.conf"
    exit 0
}

function isDarwin {
    mv -f $CUR_DIR/* $NEW_DIR/
    ln -sf "$NEW_DIR/ee/sc/scrp" "/usr/local/bin/scrp"
    cp "$NEW_DIR/ee/etc/conffile.conf" "/etc/conffile.conf"
    exit 0
}

#
#   =============================================
#   ================== MAIN =====================
#   =============================================
#

CUR_DIR=${1%/}
NEW_DIR=${2%/}

if [ ! -d "$CUR_DIR" ]; then
    echo ""
    echo "blah blah"
    usage
    exit 1
fi

if [ ! -d "$NEW_DIR" ]; then
    echo ""
    echo "The target directory supplied does not exist. Creating target directory $NEW_DIR"
    mkdir "$NEW_DIR"
    if [ $? -ne 0 ]; then
        echo "Could not create target directory. Exiting..."
        exit 1
    else
        echo "Directory $NEW_DIR created"
    fi
    echo ""
fi

UNAME=$(uname)
if [ $UNAME == "Darwin" ]; then
    isDarwin
else
    notDarwin
fi

It throws the following syntax error when run as sudo bash script.sh "arg1" "arg2" on macOS with bash 3.2

'script.sh: line 7: syntax error near unexpected token `{
'script.sh: line 7: `function usage {

I am rather new to OS X, maybe there is a gotcha I am missing. The script ran fine on Linux...

Thanks

Upvotes: 1

Views: 1890

Answers (2)

Vicky Patil
Vicky Patil

Reputation: 11

This problem usually occurs when the shell script is generated on windows or other system.

Steps: Just run this command on terminal.

bash-5.2$ dos2unix your_script.sh

you may need to install dos2unix. For which use

bash-5.2$ brew install dos2unix

Upvotes: 0

Tom Fenech
Tom Fenech

Reputation: 74595

Linux and modern OS X expect lines to end with LF (line feed) characters. If your lines end with CR + LF, then you will run into problems.


Some other general pointers:

The function syntax is non-standard. You should use the standard syntax, supported by all POSIX-compliant shells:

Change:

function usage {

to:

usage() {

and I suspect that all will be well.

As an aside, you should quote all of your parameter expansions (you've missed a couple). It's also considered good practice to use lowercase variable names, as uppercase ones are used by the shell and you run the risk of clashing with them.

Upvotes: 1

Related Questions