Лучше, чем иметь несколько элиф - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть файл file.txt, в котором есть несколько случайных чисел от 1 до 100. Таким образом, скрипт читает файл, выполняет несколько команд и печатает некоторые операторы.

Один из способов достижения результатаможет быть что-то вроде этого, но иметь в скрипте операторы 100 if и elif выглядит не очень хорошо.

for i in `cat file.txt`; do
  echo "Displaying" $i
    if [[ $i = 1 ]]; then
        echo "blah blah blah for" $i
        command1
        command2
    elif [[ $i = 2 ]]; then
        echo "blah blah blah for" $i
        command3
        command4
        command5
    elif [[ $i = 3 ]]; then
        echo "blah blah blah for" $i
        command6
        command7
    elif [[ $i = 4 ]]; then
        echo "blah blah blah for" $i
        command8
        command9
        command10
    elif [[ $i = 5 ]]; then
        echo "blah blah blah for" $i
        command11
        command12
        command13
        command14
    elif [[ $i = 6 ]]; then
        echo "blah blah blah for" $i
        command15

        ....
        ....
        ....
        ....
        ....
        ....
    elif [[ $i = 99 ]]; then
        echo "blah blah blah for" $i
        command310
        command311
        command312
        command313
        command314
    elif [[ $i = 100 ]]; then
        echo "blah blah blah for" $i
        command315
    fi
done

Есть ли лучший или умный способ сделать это на bash

Ответы [ 2 ]

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

Я бы предложил использовать оператор case. Это bash-версия того, что в программировании известно как оператор switch . Они, как правило, быстрее, чем оператор if-then-else, поскольку они, скорее всего, реализованы с помощью таблицы поиска или хэш-списка.

Кроме того, оптимизированная реализация может выполняться намного быстрее, чем альтернативная, поскольку она часто реализуется с использованием индексированной таблицы ветвей. Например, решение о потоке программы, основанное на значении одного символа, если оно правильно реализовано, значительно эффективнее альтернативы, значительно сокращая длину пути инструкций. При реализации как таковой оператор switch по сути становится идеальным хешем.

источник: Википедия

Интересное сравнение можно найти здесь: Что быстрее двух случаев или если?

Чтобы обратиться к вашему коду, вы в цикле формы

for i in $(cat file); do
  ...
done

следует переписать. Когда вы читаете файл слово за словом, вы должны написать что-то вроде:

while read -r line; do
   for i in $line; do
     ...
   done
done < file

Вы, если-то-еще, затем переписывается как:

case "$i" in
   1) command1; command2; command3 ;;
   2) command4; command5; command6 ;;
   ...
   100) command315; command316;;
esac
0 голосов
/ 19 ноября 2018

Классический регистр case:

case "$i" in
    1)
        echo "blah blah blah for" $i
        command1
        command2
        ;;
    […]
    *)
        echo "Unhandled value $i" >&2
        exit 2
esac

В дополнение к этому:

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