Сценарий оболочки, если условие не оценено для отображения справочной информации для пользователя - PullRequest
0 голосов
/ 06 сентября 2018

Я написал справочное меню для справки об использовании сценария оболочки my_script.sh

echo $'\n\n'
echo $(printf '=%.0s' {1..100})
printf ' %.0s' {1..40}
echo "Welcome"
echo $(printf '=%.0s' {1..100})
echo $'\n'

arg=$1
echo "Input : $arg"
echo

if [[ arg -eq "-h" ]] || [[ arg -eq "-H" ]] || [[ arg -eq "-help" ]] || [[ arg -eq "-Help" ]] || [[ arg -eq "--h" ]] || [[ arg -eq "--H" ]] || [[ arg -eq "--help" ]] || [[ arg -eq "--Help" ]]; then
    echo "Help menu requested...."
    echo $'\n\n'
    echo $(printf '~%.0s' {1..100})
    printf ' %.0s' {1..43}
    echo "Help Menu"
    echo $(printf '~%.0s' {1..100})
    echo $'\n'
    exit 0
else
    echo "Executing a program...."
    ./another_script.sh
fi

Когда я выполняю `myscript.sh -h '(или любой из префиксов' - '), он переходит к условию if, но любой другой аргумент - нет. Что я здесь не так делаю? Я новичок в bash-скриптах.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

К сожалению, я не знаю точную причину, по которой ваш код не работает, но я могу предложить вам быстрое решение: вы можете написать «==» вместо «-eq» и ​​поставить префикс вашей переменной «arg» с долларом знак. Тогда ваш скрипт должен работать нормально.

Рабочий пример (GNU bash 4.4.19):

arg=$1

if [[ $arg == "-h" ]] || [[ $arg == "-H" ]]; then
  echo "Help!"
else
  echo "Stop!"
fi
0 голосов
/ 06 сентября 2018
  1. операция -eq используется только для сравнения чисел.
  2. Для сравнения строк используется операция =
  3. Вы забыли $ знак для переменных arg в Bash, должен быть $arg
  4. Когда мы используем переменные в Bash, нам лучше использовать двойные кавычки.
  5. используйте @() для сравнения нескольких строк.

поэтому условия if [[ arg -eq "-h" ]] должны быть [[ "$arg" = "-h" ]]

При сравнении переменной с несколькими строками мы можем использовать [[ "$arg" = @(-h|-H|--help|--HELP|--h|--H|-help|--HELP) ]].

if [[ "$arg" = @(-h|-H|--help|--HELP|--h|--H|-help|--HELP) ]]; then
     echo "Help menu requested...."
     echo $'\n\n'
     echo $(printf '~%.0s' {1..100})
     printf ' %.0s' {1..43}
     echo "Help Menu"
     echo $(printf '~%.0s' {1..100})
     echo $'\n'
     exit 0
else
     echo "Executing a program...."
     ./another_script.sh
fi

Кроме того, мы можем использовать boxes ( boxes - неограниченное количество полей командной строки ASCII! ) для создания окна комментария

cat <<EOF | boxes -a c -d shell -p a5 -s 30x9
HELP MENU

bla bla
EOF

вывод:

########################################
#                                      #
#                                      #
#              HELP MENU               #
#                                      #
#               bla bla                #
#                                      #
#                                      #
########################################
0 голосов
/ 06 сентября 2018

Две простые проблемы с вашим if:

Но: я бы порекомендовал использовать getopts вместо сравнения строк. Это сделало бы деталь более надежной, учитывая различный порядок параметров или когда параметры из одной буквы объединяются в один аргумент.

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