Как изменить аргумент командной строки в 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.

Смотрите также

  1. Мой более короткий ответ на Ask Ubuntu здесь: Как изменить значение аргумента в скрипте?
Другие вопросы по тегам