Есть ли способ изменить аргументы командной строки в сценарии Bash? Например, сценарий Bash вызывается следующим образом:
./foo arg1 arg2
Есть ли способ изменить значение arg1 в скрипте? Что-то типа:
$1="chintz"
Ответы:
Вам нужно сбросить все аргументы. Чтобы изменить, например $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
Надеюсь, это кому-то пригодится.