我正在尝试执行类似的操作来制作脚本以在备份失败后执行备份。我将环境作为脚本的参数。
我不确定该怎么做的一件事是我想验证$ 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
答案 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
。)