zsh :извлекать аргументы командной строки в две строки

  1. mc files ожидает `x' кавычки [исправлено в исправленной версии вопроса]

    1. Вы внедрили стандартную рекомендацию запретить отправку «простого текста» (незашифрованного )пароля по незашифрованным SMTP-соединениям [флаг pв confAUTH_OPTIONS].

    2. Ваш смарт-хост предлагает только аутентификацию открытым текстом [см. строки AUTHв ответе EHLO] , но он не предлагает обновление до зашифрованного соединения [нет STARTTLSв ответе EHLO].

    3. По сути, ваша конфигурация запрещает отправлять незашифрованный пароль по незашифрованному SMTP-соединению, но ваш смарт-хост не предлагает другого варианта.
1
13.01.2021, 09:05
1 ответ
set -o extendedglob

first_set=("$@[1,(i)^-*]")
first=${(j[ ])first_set}

будет хранить в $firstконкатенацию всех аргументов до первого, который не начинается с -с одним пробелом между ними.

Затем за $secondвы можете получить остальные:

second_set=("$@[$#first_set + 1, -1]")
second=${(j[ ])second_set}

В любом случае обратите внимание, что $@не является строкой , это список из 0 или более строк.

Например, если вы вызываете свой сценарий из оболочки типа Bourne, используя командную строку, такую ​​как:

script.sh -i   -l 'foo bar'   'File 1' File\ 2   "File 3"

Это выполняет ваш скрипт как:

execve("/path/to/script.sh", ["script.sh", "-i", "-l", "foo bar",
                              "File 1", "File 2", "File 3"], environ)

Что становится (при условии, что скрипт начинается с#! /bin/zsh -):

execve("/bin/zsh", ["/bin/zsh" /* or "script.sh" depending on the system*/,
                    "-", "/path/to/script.sh", "-i", "-l", "foo bar",
                    "File 1", "File 2", "File 3"], environ)

И в вашем сценарии $@будет содержать все те строки в аргументе argv[]для execve(), которые идут после /path/to/script.sh.

Выше мы разделили этот список на два набора($first_setи $second_setпеременных-массивов ), а затем объединили аргументы в этих наборах в две скалярные переменные($firstи$second). Но после того, как это объединение будет выполнено, вы больше не сможете вернуться к исходному списку аргументов. Например, $secondв этом случае будет содержать File 1 File 2 File 3, и невозможно определить, какие из этих пробелов разграничивают аргументы, а какие были частью аргументов.

1
18.03.2021, 22:37

Теги

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