Я написал небольшой шелл-код, но мне нужно изменить переменную при вызове кода, как это сделать

Примере

./shell.sh --varaible="New Value"

Должен выводить

New Value,Some Value

Shell.sh

variable="Old Value"
variable2="Some Value"

echo "$variable,$variable2"
0
Michael Homer 17 Фев 2018 в 12:05
1
Я не уверен, что форматирование кода, которое я вставил, точно соответствует тому, что вы намеревались - вы можете отредактировать вопрос себя, чтобы исправить это.
 – 
Michael Homer
17 Фев 2018 в 12:06

1 ответ

Лучший ответ

Невозможно изменить значение переменной в сценарии из командной строки, если сценарий явно устанавливает значение этой переменной.

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


Аргументы, указанные в командной строке, будут доступны для сценария оболочки в позиционных параметрах $1, $2, $3 и т. д.

Чтобы установить переменную в первый позиционный параметр, вы должны использовать

variable="$1"

Итак, ваш сценарий может выглядеть так

#!/bin/sh

variable="$1"
variable2="Some Value"

echo "$variable,$variable2" # or printf '%s,%s\n' "$variable" "$variable2"

... и будет вызван с

$ ./script.sh "New Value"

Выход будет

New Value,Some Value

Чтобы указать значение по умолчанию для переменной, вы можете сделать

variable="${1:-Old Value}"

Используя это в приведенном выше сценарии, на выходе будет указано Old Value,Some Value, если сценарий не вызывается с какими-либо аргументами командной строки.


Следующий короткий скрипт правильно анализирует три флага командной строки -a, -b и -c. Флаги -a и -b принимают аргумент, а -c - нет. Он использует три переменные, var_a, var_b и var_c, которые имеют значения по умолчанию, которые можно переопределить с помощью флагов командной строки.

В конце скрипт отображает значения этих переменных, а также отображает то, что еще могло быть задано в командной строке.

#!/bin/sh

var_a=12
var_b="yellow"
var_c=0

while getopts 'a:b:c' opt; do
    case "$opt" in
        a) var_a=$OPTARG ;;
        b) var_b=$OPTARG ;;
        c) var_c=1 ;;
        *) echo 'command line parsing error' >&2
           exit 1
    esac
done

shift $(( OPTIND - 1 ))

printf 'var_a = %s\nvar_b = %s\nvar_c = %s\n' \
    "$var_a" "$var_b" "$var_c"

if [ "$#" -gt 0 ]; then
    echo 'Other operands:'
    printf '%s\n' "$@"
fi

Запускаем несколько раз:

$ ./script.sh
var_a = 12
var_b = yellow
var_c = 0

$ ./script.sh -b "green tea" "hello world"
var_a = 12
var_b = green tea
var_c = 0
Other operands:
hello world

$ ./script.sh -c my other car is a cdr
var_a = 12
var_b = yellow
var_c = 1
Other operands:
my
other
car
is
a
cdr

$ ./script.sh -a -d
var_a = -d
var_b = yellow
var_c = 0

$ ./script.sh -a
./script.sh[15]: -`a' requires argument
command line parsing error

$ ./script.sh -a "boo!" "help!" -c
var_a = boo!
var_b = yellow
var_c = 0
Other operands:
help!
-c
3
Kusalananda 17 Фев 2018 в 12:58
Спасибо большое, с вашей помощью добрался до нужного места. Отличный совет.
 – 
evenom
22 Фев 2018 в 00:01