Сделайте так, чтобы "case case" повторялся с массивом неизвестной длины - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно установить ряд параметров, чтобы увеличить мощность ifaces, подключенных к системе.

echo "Options: "
echo "[0] Back"

for i in "${#INTERFACES[@]}"; do
    echo "[ $(($i+1)) ] set ${INTERFACE[$i]} to max power"
done

echo "[ $(($i{#INTERFACES[@]}+1)) ] set ALL ifaces to max power"
echo ""

Этот код дает мне это меню:

Options: 
[0] Back
[1] Set wlan0 to max power
[2] Set wlan1 to max power
[3] set ALL ifaces to max power

${INTERFACES[@]} имеет 2 элемента в этом примере ("wlan0" "wlan1"), но может быть любым числом. И тут возникает моя проблема:

read -p "Input from user: " USER_INPUT
case $USER_INPUT in
    [0]* ) function_back; break;;
# I need here iterate over items in ${INTERFACES[@]}. 1) and 2) for wlan0 and wlan1 respectively.
    [3]* function_ALL; break;;

Я попытался с помощью «select», но у меня не получилось, потому что он не позволил мне начать с 0) и изменил оператор различных опций, я просто получил это:

1) wlan0
2) wlan1

Мне нужно придерживаться первоначальной идеи, поэтому решение с «делом» будет высоко оценено.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вот простой пример использования select:

interfaces=(wlan0 wlan1)
options=(Back)
for ifc in "${interfaces[@]}"; do
    options+=("Set $ifc to max power")
done
options+=("set ALL ifaces to max power")

functions=(function_back function_1 function_2 function_ALL)

function_back () { echo "back"; }
function_1 () { echo "setting 1"; }
function_2 () { echo "setting 2"; }
function_ALL () { echo "setting all"; }



select opt in "${options[@]}"; do
    "${functions[$REPLY]}"
    break
done

Существует два параллельных массива: options содержит строки для отображения в меню, а functions хранит имя соответствующая функция для запуска.

В этом операторе select мы будем предполагать, что пользователь вводит только номера опций; этот номер хранится в REPLY (opt содержит значение из options, соответствующее этому номеру), поэтому мы индексируем functions с помощью REPLY, чтобы получить имя вызываемой функции, а затем вызвать ее. После того, как он возвращается, мы ломаемся.

0 голосов
/ 27 марта 2020

В качестве альтернативы решению @chepner дал мне. Это блок, который я использую, чтобы сначала сохранить меню, построенное с echo.

#GET INPUT USER
read -p "Input from user: " USER_INPUT

#"0" WILL BE ALWAYS FOR BACK FUNCTION
if (( "$USER_INPUT" == "0" ))
then
     echo "back"

#"1" WILL BE ALWAYS THE FIRST INTERFACE, AND THE LAST INTERFACE WILL BE THE LENGTH OF $INTERFACES[@]
elif (( "$USER_INPUT" <= "${#INTERFACES[@]}" ))
then
     echo "iface = ${INTERFACES[$(($USER_INPUT-1))]}"

#THE LENGTH OF $INTERFACES[@]+1 WILL BE ALWAYS THE "ALL" OPTION
elif (( "$USER_INPUT" == "$((${#INTERFACES[@]}+1))" ))
then
     echo "all"

#EVERYTHING ELSE WILL BE INVALID
else
     echo "Invalid input!"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...