Обработка всех аргументов, кроме первого (в скрипте bash) - PullRequest
375 голосов
/ 30 января 2012

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

С помощью Google я нашел эту вики , но она предоставила буквальный пример:

echo "${@: -1}"

Я не могу заставить работать что-либо еще, например:

echo "${@:2}"

или

echo "${@:2,1}"

Я получаю "Плохая замена" из терминала.

В чем проблема, и как я могу обработать все, кроме первого аргумента, переданного скрипту bash?

Ответы [ 3 ]

548 голосов
/ 30 января 2012

Используйте это:

echo "${@:2}"

Следующий синтаксис:

echo "${*:2}"

также будет работать, но не рекомендуется, потому что @ Gordon уже объяснил, что, используя *, он запускает все аргументы вместе как один аргумент с пробелами, в то время как @ сохраняет разрывы между ними (даже если некоторые из аргументов сами содержат пробелы).Это не имеет значения с echo, но имеет значение для многих других команд.

157 голосов
/ 30 января 2012

Если вам нужно решение, которое также работает в /bin/sh, попробуйте

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"

shift [n], смещая позиционные параметры n раз.shift устанавливает значение $1 равным значению $2, значение $2 равным значению $3 и т. Д., Уменьшая значение $# на единицу.

4 голосов
/ 03 апреля 2012

http://wiki.bash -hackers.org / scripting / posparams

Объясняется использование shift (если вы хотите отбросить первые N параметров), а затем реализация массового использования(ищите заголовок с таким названием).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...