Как изменить аргумент командной строки в Bash?
Есть ли способ изменить аргументы командной строки в скрипте Bash. Скажем, например, сценарий Bash вызывается следующим образом:
./foo arg1 arg2
Есть ли способ изменить значение arg1 в скрипте? Скажи что-то вроде
$1="chintz"
4 ответа
Вы должны сбросить все аргументы. Изменить например $3
:
$ set -- "${@:1:2}" "new" "${@:4}"
По сути, вы устанавливаете для всех аргументов их текущие значения, кроме одного (-ых), который вы хотите изменить. set --
также указано в POSIX 7.
"${@:1:2}"
нотация расширена до двух (отсюда 2
в обозначениях) позиционные аргументы, начинающиеся со смещения 1
(т.е. $1
). Это сокращение для "$1" "$2"
в этом случае, но это гораздо полезнее, когда вы хотите заменить, например, "${17}"
,
Оптимизация для удобочитаемости и ремонтопригодности, вам может быть лучше назначить $1
а также $2
к более значимым переменным (я не знаю, input_filename = $1
а также output_filename = $2
или что-то), а затем перезаписать одну из этих переменных (input_filename = 'chintz'
), оставляя входные данные для сценария без изменений, если это необходимо в другом месте.
Я знаю, что это старый, но я нашел ответ thkala очень полезным, поэтому я использовал эту идею и немного расширил ее, чтобы позволить мне добавить значения по умолчанию для любого аргумента, который не был определен, например:
# set defaults for the passed arguments (if any) if not defined.
#
arg1=${1:-"default-for-arg-1"}
arg2=${2:-"default-for-arg-2"}
set -- "${arg1}" "${arg2}"
unset arg1 arg2
Надеюсь, это кому-то пригодится.
Как изменить аргументы командной строки$1
,$2
и т. д. в bash, используяset --
В дополнение к основному ответу @Radu Rădeanu на Ask Ubuntu здесь и к я хотел бы добавить очень простой пример одновременной установки нескольких аргументов, например:
# set arguments `$1`, `$2`, and `$3` to these respective values
set -- "one" "two" "three"
echo "$1 $2 $3"
Выход:
one two three
Если у вас есть дополнительные аргументы после аргументов, которые вы хотите изменить, вы можете сохранить их, обрезав их до конца, например:
set -- "one" "two" "three" "${@:4}"
Я объясняю синтаксис нарезки в своем ответе здесь: Unix и Linux: Bash: срез позиционных параметров . См. этот ответ для получения более подробной информации о нарезке массива bash . Вот небольшой фрагмент оттуда:
# array slicing basic format 1: grab a certain length starting at a certain # index echo "${@:2:5}" # │ │ # │ └────> slice length # └──────> slice starting index # array slicing basic format 2: grab all remaining array elements starting at a # certain index through to the end echo "${@:2}" # │ # │ # └──────> slice starting index
Итак, в основному ответу @thkala на Stack Overflow здесьосновном ответе @thkala , который содержит следующее:
set -- "${@:1:2}" "new_arg3" "${@:4}"
... объяснение в том, что"${@:1:2}"
захватывает первые 2 аргумента,"new_arg3"
вставляет это как новый аргумент 3 и"${@:4}"
захватывает все аргументы от 4 до конца, тем самым изменяя только аргумент 3 и сохраняя все остальные аргументы такими, какие они были.
Для помощи поset
встроенная команда bash, см. или посмотрите онлайн здесь: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin
help set
показывает следующее для--
аргумент:
-- Assign any remaining arguments to the positional parameters. If there are no remaining arguments, the positional parameters are unset.
Смотрите также
- Мой более короткий ответ на Ask Ubuntu здесь: Как изменить значение аргумента в скрипте?