基本的shell bash检查/切换参数

时间:2015-08-17 20:43:05

标签: bash

这是一个初学者问题,我已经检查了Check existence of input argument in a Bash shell script,但它并没有完全解释我想要做什么。

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

所以你理解这个非常基本的用例,根据参数(如果有1,2或3),脚本将执行不同的任务。

我知道这很简单,这就是为什么我认为我错过了一些明显的东西。

感谢您的帮助

我验证的回答给了我一些错误但引导我找到正确的东西:

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;

2 个答案:

答案 0 :(得分:3)

else if替换为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;

其他建议:

  • 始终双引号包含变量替换的单词,否则单词拆分和shell globbing可以对扩展变量内容生效。
  • 始终使用[[代替[,因为前者更强大,并且保持一致性很好。
  • 如果不需要插值,请使用单引号而不是双引号,因为单引号不会插入任何;这样更安全。

答案 1 :(得分:1)

您可以使用if构造完全省略${var:?msg}语句,如果给定变量没有非空值,它将退出脚本。

: ${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"