Назначение переменной положения в bash

Как назначить переменную позиции в условии if?

Например, мой скрипт называется test.sh Если я задаю первую переменную как «T», я бы хотел видеть напечатанные переменные $ 2 и $ 3. Основной причиной является использование переменных $ 2 и $ 3 в других случаях позже. Я хотел бы установить переменные $ 2 и $ 3 10 и 15 соответственно.

 #!/bin/bash

echo "The first variable : $1"
echo "The second variable  : $2"
echo "The third variable : $3"
if [ $1 == "T" ]
        then
         $2 = 10
         $5 = 15
fi
echo "$2"
echo "$3"

Ошибка показывает: «команда не найдена». Я предполагаю, что я делаю синтаксическую ошибку?

Всего 2 ответа


Вы не можете назначить «переменные положения» (параметры). Однако вы можете использовать set, но вы можете потерять другие параметры:

#!/bin/bash

echo "The first variable : $1"
echo "The second variable  : $2"
echo "The third variable : $3"
if [ "$1" == "T" ]
        then
        set -- T 10 15
fi
echo "$2"
echo "$3"

Если вы хотите сохранить другие параметры, вам нужно будет использовать "$@" и shift :

$ set -- 1 2 3 4 5 6 7 8 9 10
$ echo "$@"
1 2 3 4 5 6 7 8 9 10
$ set -- T 10 15
$ echo "$@"
T 10 15
$ set -- 1 2 3 4 5 6 7 8 9 10
$ shift 3
$ set -- T 10 15 "$@"
$ echo "$@"
T 10 15 4 5 6 7 8 9 10

если вы хотите отказаться от POSIX-совместимости, вы также можете использовать предложение ruakh в bash / zsh:

$ set -- 1 2 3 4 5 6 7 8 9 10
$ echo ${@:4}"
4 5 6 7 8 9 10
$ set -- T 10 15 "${@:4}"
$ echo "$@"
T 10 15 4 5 6 7 8 9 10

Примечание: «переменные положения» на самом деле являются параметрами оболочки . Кроме того, вы четко заявили, что хотите их использовать, но я должен сказать вам, что в большинстве случаев вам лучше использовать обычные переменные оболочки.


Да, у вас есть синтаксическая ошибка. Способ присвоения переменной - NAME=VALUE . Обратите внимание, нет знака доллара и пробелов вокруг знака равенства. Однако 2=VALUE также недопустимо, поскольку число не является допустимым именем. $2 на самом деле параметр , а не переменная.

Вы не должны назначать пронумерованные параметры. Вы можете сделать это, используя set -- , но лучший способ - дать им имена в качестве переменных, например

#!/bin/bash

first="$1"
second="$2"
third="$3"

echo "The first variable: $first"
echo "The second variable: $second"
echo "The third variable: $third"
if [ "$first" == "T" ]; then
    second=10
    third=15
fi
echo "$second"
echo "$third"

Есть идеи?

10000