Проверьте аргументы bash-скрипта - PullRequest
3 голосов
/ 06 июля 2019

Я пытаюсь сделать что-то подобное, чтобы создать сценарий для резервного копирования, если они не удаются.Я принимаю в качестве аргумента сценария окружение.

Единственное, что я не уверен в том, как это сделать, - это то, что я хочу проверить 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 ]

3 голосов
/ 06 июля 2019

Вы можете использовать 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

Обратите внимание на двойной ;;, чтобы завершить каждый случай, и удобное использование сопоставления с образцом .

Отредактируйте: следуя вашему комментарию и предложению @CharlesDuffy, если вы хотите иметь все допустимые параметры в массиве и проверить свое значение по любым из них (следовательно, иметь один и тот же кусок кода для все допустимые значения), вы можете использовать ассоциативный массив :

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, но это может быть что-то еще в этом случае), присвоенного каждый допустимый параметр.Таким образом, любой недопустимый параметр будет нулевым, и сработает тест -z.

Кредиты перейдут к нему.

1 голос
/ 06 июля 2019

В зависимости от того, сколько у вас различных значений, как насчет оператора case? Это даже позволяет для globbing.

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

С другой стороны, если вы можете, вам следует избегать непортативных ошибок, таких как тестовый оператор [[ (и использовать [, если можете, например, if [ "$1" = "John" ]; then ...; fi.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...