У меня есть простой script, где первый аргумент зарезервирован для имени файла, а все остальные необязательные аргументы должны быть переданы другим частям script.
Используя Google, я нашел эту вики, но он предоставил буквальный пример:
echo "${@: -1}"
Я не могу заставить ничего работать, например:
echo "${@:2}"
или
echo "${@:2,1}"
Я получаю "плохую замену" с терминала.
В чем проблема, и как я могу обработать все, кроме первого аргумента, переданного в bash script?
Используйте это:
echo "${@:2}"
Следующий синтаксис:
echo "${*:2}"
будет работать, но не рекомендуется, потому что @Gordon уже объяснил, что с помощью *
он запускает все аргументы вместе как один аргумент с пробелами, а @
сохраняет разрывы между ними (даже если некоторые из самих аргументов содержат пробелы). Это не имеет значения с echo
, но это важно для многих других команд.
#!/usr/bin/env sh
Вот почему у меня были проблемы. Вы пример работает нормально, так же, как указано выше, после того, как я удалил этот shebang
"${@:2}"
- использование *
запускает все аргументы вместе как один аргумент с пробелами, в то время как @
сохраняет разрывы между ними (даже если некоторые из аргументов сами содержат пробелы). С echo
разница не заметна, но имеет значение для многих других вещей.
Если вы хотите решение, которое также работает в /bin/sh
, попробуйте
first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"
shift [n]
сдвигает позиционные параметры n раз. A shift
устанавливает значение $1
на значение $2
, значение $2
на значение $3
и т.д., Уменьшая значение $#
на единицу.
foo=shift
не делает то, что я ожидал.
http://wiki.bash-hackers.org/scripting/posparams
В нем объясняется использование shift
(если вы хотите отбросить первые N параметров), а затем реализовать массовое использование (найдите заголовок с этим заголовком).
"{@:2}"
не работал, поэтому правильный ответ совпадает с приведенным выше.