验证bash脚本参数

时间:2019-07-06 19:29:45

标签: bash

我正在尝试执行类似的操作来制作脚本以在备份失败后执行备份。我将环境作为脚本的参数。

我不确定该怎么做的一件事是我想验证$ 1只包括一些预定义的值。预定义的值应类似于tst,prd,qa,rpt。任何人?

#!/bin/bash
ENVIRONMENT=$1 
BACKUPDATE=$(date +"%d_%m_%Y")
BACKUPFILE="$ENVIRONMENT".backup."$BACKUPDATE".tar.gz

if [ $1 ==  "" ] 
 then
 echo "No environment specified"
 exit
elif [ -f "$BACKUPFILE" ]; then
   echo "The file '$BACKUPFILE' exists."
else
   echo "The file '$BACKUPFILE' in not found."
   exec touch "$BACKUPFILE"
fi

2 个答案:

答案 0 :(得分:3)

您可以使用case

case "$1" in
    tst) echo "Backing up Test style" ;;
    prd)
        echo "Production backup"
        /etc/init.d/myservice stop
        tar czf ...
        /etc/init.d/myservice start
        ;;
    qa) echo "Quality skipped" ;;
    rpt)
        echo "Different type of backup"
        echo "This could be another processing"
        ...
        ;;
    *)
        echo "Unknown backup type"
        exit 2
        ;;
esac

请注意,双引号;;和每种情况下的convenient use of pattern matching

编辑:如果要在数组中包含所有有效选项,并针对其中的任何测试值,则遵循注释和@CharlesDuffy的建议(因此,对于所有有效值),则可以使用associative array

declare -A valids=(["tst"]=1 ["prd"]=1 ["qa"]=1 ["rpt"]=1)
if [[ -z ${valids[$1]} ]] ; then
    echo "Invalid parameter value"
    # Any other processing here ...
    exit 1
fi
# Here your parameter is valid, proceed with processing ...

这是通过为每个有效参数分配一个值(此处为1,但在这种情况下可以是其他任何值)来实现的。因此,任何无效参数都将为null,并且-z测试将触发。

信用归他所有。

答案 1 :(得分:1)

取决于您拥有多少个不同的值,case语句又如何呢?它甚至还可以进行遍历。

case $1 in
  (John)   printf "Likes Yoko\n";;
  (Paul)   printf "Likes to write songs\n";;
  (George) printf "Harrison\n";;
  (Ringo)  printf "Da drumma\n";;
  (*)      printf "Management, perhaps?\n";;
esac

另一方面,如果可以的话,您应该避免使用[[测试运算符之类的不可移植的Bashisms(并尽可能使用[,例如if [ "$1" = "John" ]; then ...; fi。)