Bash, если еще сравнить num1 с num2 или num3 не сравнивается правильно - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в bash-скриптинге и мне нужна помощь.

Я создал скрипт, который должен сравнивать пользовательский ввод (фиксированный выбор для 045, 046, 287 или 279). С другими ценностями.

Когда пользователь вводит 045 или 046, тогда оператор if равен true и должен отображать

Вы выбрали $ SID. Будет использовано меню 1

Если пользователь вводит 287 или 279, утверждение должно быть ложным и отображать

Вы выбрали $ SID. Будет использовано меню 2

$ SID - это пользовательский ввод, указанный выше.

  if [ "$SID" == "046" -o "045" ] ; then
        printf "You have choosen $SID. Menu 1 will be used" 
        else 
        printf "You have choosen $SID. Menu 2 will be used"
  fi

Но при запуске сценария он всегда отображает истинное утверждение с пользовательским вводом, отображаемым в расположении $ SID.

You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
You have choosen 287. Menu 1 will be used
You have choosen 279. Menu 1 will be used

Что бы я ожидал, это:

Когда используется 045 или 046:

You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used

Когда используется 279 или 287:

You have choosen 287. Menu 2 will be used
You have choosen 279. Menu 2 will be used

Я также попробовал следующее выражение if без результатов:

  if [ $SID -eq 046 -o 045 ] ; then

  if [ "$SID" -eq "046" -o "045" ] ; then

  if [ $SID = 046 -o 045 ] ; then

  if [ "$SID" = "046" -o "045" ] ; then

Что мне не хватает?

1 Ответ

0 голосов
/ 08 ноября 2018

-o объединяет выражения, а не несколько значений в одном выражении.

if [ "$SID" = 046 -o "$SID" = 045 ] ; then

Однако сам -o не должен использоваться; он считается устаревшим и не гарантируется, что будет поддерживаться POSIX-совместимой оболочкой. Вместо этого используйте ||, чтобы объединить две отдельные команды [.

if [ "$SID" = 046 ] || [ "$SID" = 045 ] ; then

A case утверждение может быть более кратким:

case $SID in
  045|046) printf 'You have chosen %s. Menu 1 will be used\n' "$SID" ;;
  *)       printf 'You have chosen %s. Menu 2 will be used\n' "$SID" ;;
esac

, который немедленно предложил бы (выделено моим использованием пробела) рефакторинг

case $SID in
  045|046) menu=1 ;;
  *) menu=2 ;;
esac

printf 'You have chosen %s. Menu %s will be used\n' "$SID" "$menu"

Учитывая, что вы на самом деле используете bash, вы можете выбрать команду [[ вместо [, которая позволяет case -стиль сопоставления с шаблоном:

if [[ $SID = 04[56] ]]; then
...