Zsh — последний аргумент передается в сценарий оболочки?

У меня нет dockercli, но, возможно, некоторые эксперименты с использованием sh -cв качестве замены могут предоставить аналогичную команду для разбора данных.

Чтобы проверить, что grepпередается правильная строка, я воспользуюсь примером

echo 'a   b' | ssh localhost "grep 'a   b'"

Это соответствует входной строке, содержащей 3 пробела. Если мы добавим дополнительный слой sh -c, нам понадобится

echo 'a   b' | ssh localhost "sh -c 'grep \"a   b\"'"

и еще раз для

echo 'a   b' | ssh localhost "sh -c 'sh -c \"grep   \\\"a   b\\\"\"'"
1
19.06.2020, 05:44
1 ответ

@работает в основном¹ подобно тому, как переменная, содержащая массив позиционных параметров,:$@может принимать индекс массива. Последний элемент находится в позиции $#, так как $#— это количество аргументов².

printf 'Last argument is "%s"\n' "${@[$#]}"

Альтернативно, в индексе массива отрицательные значения считаются с конца, поэтому [-1]принимает последний элемент.

printf 'Last argument is "%s"\n' "$@[-1]"

Другой способ получить последний аргумент — использовать флаг раскрытия параметра P, который дважды выполняет поиск параметра.:${(P)foo}принимает значение fooв качестве другого имени параметра и расширяет его значение. Используйте это на #, который работает как переменная, содержащая количество позиционных параметров. Однако имейте в виду, что это работает только при наличии хотя бы одного позиционного параметра, иначе вы получите$0(имя текущего скрипта ). При использовании массива @этой проблемы нет.

printf 'Last argument is "%s"\n' "${(P)#}"

¹ Разница в том, что $@имеет подразумеваемый флаг@в расширении параметра , поэтому "$@"и "$@[1,3]"расширяются до нескольких слов, например "$array[@]"и "${(@)array[1,3]}"..
² Zsh считает как позиционные параметры, так и элементы массива с 1 (, если не включена опция совместимости ksh_arrays, и в этом случае элементы массива считаются с 0, а последним элементом будет${@[${#}-1]}).

2
18.03.2021, 23:26

Теги

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