#bash #shell #script
Вопрос:
Предположим, я хочу прочитать два ввода, скажем, x и y. И в соответствии со значениями из них я хочу выполнить регистр переключения в скрипте Bash.
Скажем, 4 комбинации входных данных являются
x=0
,y=0
,x=0
,y=1
,x=1
,y=0
,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