Обработать все аргументы, кроме первого (в bash script)

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

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

echo "${@: -1}"

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

echo "${@:2}"

или

echo "${@:2,1}"

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

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

Ответ 1

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

echo "${@:2}"

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

echo "${*:2}"

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

Ответ 2

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

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "[email protected]"

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