François Richard
François Richard

Reputation: 7035

basic shell bash checking/switch arguments

This is a beginner question, I have already checked that Check existence of input argument in a Bash shell script but it doesn't fully explain what I want to do.

gcc -Wall cx17.$1.c -o cx17.$1

if [ -z "$1" ]
  then
    echo "No argument supplied"
else if [ -z "$2"]
    then
        echo "Data file is missing!!"   
else if [ -z "$3"]
    then
        ./cx17.$1 $2 > ./cx17.$1.$2 
else 
    ./cx17.$1 $2 $3 > ./cx17.$1.$2 

fi

So you understand this very basic use case, depending on arguments (if there is 1, 2 or 3) the script will perform a different task.

I know it's really simple that's why I think I'm missing something obvious.

Thanks for your help

The answered I validate gave me some errors but lead me to the right stuff:

if [ -z "$1" ]; then
    echo 'No argument supplied';
elif [ -z "$2" ]; then
    echo 'Data file is missing!!';
elif [ -z "$3" ]; then
    ./cx17.$1 $2 >./cx17.$1.$2;
else
    ./cx17.$1 $2 $3 >./cx17.$1.$2;
fi;

Upvotes: 0

Views: 499

Answers (2)

chepner
chepner

Reputation: 530922

You can dispense with the if statement altogether using the ${var:?msg} construct, which will exit the script if the given variable doesn't have a non-null value.

: ${1:?No argument given}
: ${2:?Data file is missing!}

# $1 and $2 guaranteed to be non-null; the program
# will receive 1 or 2 arguments, depending on how many
# arguments are present in $@ 
./cx17."$1" "${@:2:2}" > "./cx17.$1.$2"

Upvotes: 1

bgoldst
bgoldst

Reputation: 35314

Replace else if with elif:

if [[ -z "$1" ]]; then
    echo 'No argument supplied';
elif [[ -z "$2" ]]; then
    echo 'Data file is missing!!';
elif [[ -z "$3" ]]; then
    "./cx17.$1" "$2" >"./cx17.$1.$2";
else
    "./cx17.$1" "$2" "$3" >"./cx17.$1.$2";
fi;

Other recommendations:

  • Always double-quote words that contain variable substitutions, otherwise word splitting and shell globbing can take effect on the expanded variable content.
  • Always use [[ instead of [, since the former is more powerful, and it's good to be consistent.
  • If interpolation is not required, use single-quotes rather than double-quotes, since single-quotes do not interpolate anything; it's just safer that way.

Upvotes: 3

Related Questions