У меня нет 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\\\"\"'"
@
работает в основном¹ подобно тому, как переменная, содержащая массив позиционных параметров,:$@
может принимать индекс массива. Последний элемент находится в позиции $#
, так как $#
— это количество аргументов².
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]}
).