Можно ли объединить два условия в случае переключения для сценария Bash?

#bash #shell #script

Вопрос:

Предположим, я хочу прочитать два ввода, скажем, x и y. И в соответствии со значениями из них я хочу выполнить регистр переключения в скрипте Bash.

Скажем, 4 комбинации входных данных являются

  1. x=0 , y=0 ,
  2. x=0 , y=1 ,
  3. x=1 , y=0 ,
  4. x=1 , y=1 .

Но я не знаю, как это сделать с помощью скрипта. Я попробовал код, но он выдает синтаксическую ошибку. Можно ли объединить два условия в случае переключения для сценария Bash?

 echo "enter x"
read x

echo "enter y"
read y

case "$x" "$y" in
    "zero" "zero") echo "condtion 1"
    ;;
    "zero" "one") echo "conditon 2"
    ;;
    "one" "zero" ) echo "condition 3"
    ;;
    "one" "one") echo "condition 4"
    ;;
esac
 

Ответ №1:

Вы можете думать $x$y как о двоичном числе.

 #! /bin/bash

read -p 'enter x: ' x
read -p 'enter y: ' y

case $((2#$x$y)) in
  0) echo 'condition 1';;
  1) echo 'condition 2';;
  2) echo 'condition 3';;
  3) echo 'condition 4';;
esac
 

Это работает до 64 различных состояний:

 $ echo $((64#11))
65
 

Ответ №2:

Вы могли бы использовать разделитель:

 echo "enter x"
read x

echo "enter y"
read y

SEP=":::"
case "${x}${SEP}${y}" in
    "zero${SEP}zero") echo "condtion 1"
    ;;
    "zero${SEP}one") echo "conditon 2"
    ;;
    "one${SEP}zero" ) echo "condition 3"
    ;;
    "one${SEP}one") echo "condition 4"
    ;;
esac
 

Комментарии:

1. Хороший ответ. Однако я бы вызвал read -r и использовал новую строку в качестве разделителя.

Ответ №3:

Дело касается сопоставления с образцом, проверьте это:

 $ case "a" in
>       b) echo fail;;
>       a) echo ok  ;;
> esac
ok

$ case "b" in
>       b) echo fail;;
>       a) echo ok  ;;
> esac
fail
 

Поэтому вам просто нужно передать шаблон в дело. Что в вашем случае может быть так:

 read -p "enter x(0|1): " x
read -p "enter y(0|1): " y
    
case "$x$y" in
       00) echo "condition 1";;
       01) echo "condition 2";;
       10) echo "condition 3";;
       11) echo "condition 4";;
esac
 

И разделитель необходим для лучшей читаемости(в основном).

 case "$x|$y" in
       0|0) echo "condition 1";;
       0|1) echo "condition 2";;
       1|0) echo "condition 3";;
       1|1) echo "condition 4";;
esac