korn shell - если переменная существует в массиве, остановить обработку без выхода

В конце концов я решился и купил диск, и я рад сообщить, что он у меня заработал.

Если кому-то еще интересно, я запустил:

sudo apt-get install libdvdcss libdvdread4 libdvdnav4

из командной строки. libdvdcss не установился должным образом, но, кажется, это известная проблема, которую можно решить, выполнив:

sudo /usr/share/doc/libdvdread4/install-css.sh

После этого я просто открыл DVD в проигрывателе VLC (который я ранее установил) и вуаля!

Я знаю, что это стандартная процедура для воспроизведения DVD в Linux; однако я отмечаю, что он также работает с Linux на Chromebook через Crouton, потому что по какой-то причине на других форумах много людей говорят, что это не сработает. (Многие, кто не пробовал)

Надеюсь, это поможет прояснить ситуацию для людей, которые задаются вопросом, смогут ли они в будущем смотреть DVD на Chromebook.

1
18.04.2019, 21:19
1 ответ
#!/bin/ksh

high ()   echo High
medium () echo Medium
low ()    echo Low
none ()   echo None

set -A array low medium none high

for level in high medium low none; do
    for elem in "${array[@]}"; do
        if [ "$elem" = "$level" ]; then
            "$level"
            break 2
        fi
    done
done

Это двойная петля. Внешний цикл проходит по уровням в порядке важности. Внутренний цикл перебирает элементы массива в поисках элемента, равного текущему уровню.

Если найден элемент, соответствующий текущему уровню, вызывается функция с тем же именем, что и у уровня, и происходит выход из двух циклов.

Обратите внимание, что в общем случае вы бы хотели зациклиться на "${array[@]}", а не на ${array[*]}, так как использование[*](и оставление расширения без кавычек )приведет как к разбиению слов, так и к подстановке имен файлов в строках в массив. Выражение "${array[@]}"расширится до отдельных элементов массива array, заключенных в кавычки.

Избегание разделения слов и подстановки имен файлов также является причиной цитирования $elemи $levelпри их сравнении и т. д.


Возможно, более быстрый способ сделать это — сначала создать ассоциативный массив с элементом из массива в качестве ключей, а затем просто выполнить поиск по ключу в этом:

#!/bin/ksh

high ()   echo High
medium () echo Medium
low ()    echo Low
none ()   echo None

array=( low medium none high )

typeset -A lookup

for elem in "${array[@]}"; do
    lookup["$elem"]=1
done

for level in high medium low none; do
    if [ -n "${lookup[$level]}" ]; then
        "$level"
        break 
    fi
done

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

Я также переключился на более распространенную =(...)форму присваивания для массивов.

0
28.01.2020, 00:14

Теги

Похожие вопросы