Можно ли использовать массив bash вместо набора eval - «$ params»?

Попробуйте:

# nmcli con add con-name "static-ens32" ifname ens32 type ethernet ip4 xxx.xxx.120.44/24 gw4 xxx.xxx.120.1
# nmcli con mod "static-ens32" ipv4.dns "xxx.xxx.120.1,8.8.8.8"
# nmcli con up "static-ens32" iface ens32

Далее найдите другие соединения и удалите их. Например:

# nmcli con show
NAME         UUID                 TYPE           DEVICE
ens32        ff9804db5-........   802-3-ethernet --
static-ens32 a4b59cb4a-........   802-3-ethernet ens32
# nmcli con del ens32

При следующей перезагрузке нужно поднять соединение static-ens32, так как оно единственное доступное.

3
06.01.2016, 02:06
1 ответ

Вам не нужно использовать bashмассив здесь (, но сделайте это, если вам так удобнее ).

Вот как это сделать для/bin/sh:

#!/bin/sh

for arg do
    shift

    case "$arg" in
        --my-long-flag)
            set -- "$@" -m ;;
        --another-flag)
            set -- "$@" -a ;;
        "-?"|--help)
            usage
            exit 0 ;;
        --*)
            printf 'Unrecognised long option: %s\n' "$arg" >$2
            usage
            exit 1 ;;
        *)
            set -- "$@" "$arg"
    esac
done

Это чище, чем bashрешение массива (личное мнение ), так как не нужно вводить другую переменную. Это также лучше, чем автоматически сгенерированный код -, который вы показываете, так как он сохраняет каждый аргумент командной строки как отдельный элемент в "$@". Это хорошо, потому что это позволяет пользователю передавать аргументы, содержащие символы пробела, пока они заключены в кавычки (, чего не делает автоматически -сгенерированный код ).


Комментарии к стилю:

  • Приведенный выше цикл предназначен для преобразования длинных опций в короткие для повторения цикла getoptsпозже. Таким образом, он отрывается от этой задачи, фактически воздействуя на некоторые опции, такие как -?и --help. ИМХО, вместо этого их следует перевести на-h(или какой-нибудь подходящий короткий вариант ).

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

    ./script.sh --my-long-flag -- -?
    

    не должен интерпретировать -?как опцию из-за--(означающего «здесь заканчиваются опции» ). Точно так же

    ./script.sh filename --my-long-flag
    

    не должен интерпретировать --my-long-optionкак опцию, поскольку разбор опций должен останавливаться на первой не -опции.

Вот вариант, учитывающий вышеизложенное:

#!/bin/sh

parse=YES

for arg do
    shift

    if [ "$parse" = YES ]; then
       case "$arg" in
            --my-long-flag)
                set -- "$@" -m ;;
            --another-flag)
                set -- "$@" -a ;;
            --help)
                set -- "$@" -h ;;
            --)
                parse=NO
                set -- "$@" -- ;;
            --*)
                printf 'Unrecognised long option: %s\n' "$arg" >$2
                usage
                exit 1 ;;
            *)
                parse=NO
                set -- "$@" "$arg"
        esac
     else
        set -- "$@" "$arg"
     fi

done

Это не разрешает длинные опции с отдельными аргументами опции, например--option hello(helloбудет рассматриваться как не -опция, а опция разбор закончится ). С чем-то вроде --option=helloбыло бы довольно легко справиться, если немного повозиться.

2
27.01.2020, 21:13

Теги

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