Вы не можете напрямую задавать значения позиционным параметрам, подобным этому.
Вы можете установить их с помощью команды set
, но это установит все значения ( $ 1
, $ 2
, ...)
например
$ set -- first second third fourth fifth
$ echo $1
first
$ echo $2
second
Теперь есть два случая, когда $ 2
может быть пустой строкой; первый, если значение не было передано, или второй, если ""
передается как фактический аргумент, и поэтому все еще может быть $ 3
, $ 4
и т. д.
Мы можем обработать каждый случай немного сложным способом:
#!/bin/bash
echo Before 1=$1 2=$2 3=$3 4=$4
if [ -z "$2" ]
then
first=$1
shift 2
set -- "$first" value "$@"
fi
echo After 1=$1 2=$2 3=$3 4=$4
Бит внутри теста if
обеспечит сохранение всех остальных значений.
например.
% ./testing arg1 "" "arg 3" "and arg 4"
Before 1=arg1 2= 3=arg 3 4=and arg 4
After 1=arg1 2=value 3=arg 3 4=and arg 4
Но вы могли бы сделать что-то проще и просто использовать $ {2: -value}
, которое будет оценивать как значение
, если $ 2
не установлено , поэтому вам не нужно беспокоиться о переписывании аргументов.