Я нашел проблему. Сценарий полностью устроил. Мой кард-ридер немного сломался после использования карты с кучей плохих блоков.
В частности, с zsh
, в дополнение к стандартному set -- "$@"...
, показанному @Kusalananda , позиционные параметры также доступны через массив $argv
(, как в csh ), так что вы также можете сделать:
argv+=arg # append one argument to the end
argv+=(arg2 arg3) # append several arguments
argv[1,0]=(arg1 arg2) # insert in front
argv[3,0]=(x) # insert before the 3rd element
2+=(x) # same as above (insert after the 2nd)
2+=x # append x to the second argument (not to confuse with
# the above).
argv[2,5]=(y) # replace 4 elements 2 to 5 with one y argument
argv[3,-1]=() # truncate
1=() # same as "shift"
В любой оболочке POSIX
set -- "$@" "value"
добавит value
в конец списка позиционных параметров (фактически заменит список новым более длинным списком )и
set -- "value" "$@"
добавит его в начало (и технически будет обратным shift
, поскольку shift
удаляет первый элемент ). Это верно для zsh
.
--
используется для защиты следующих значений от случайной интерпретации как опций, если они начинаются с -
.
Специальная переменная $@
используется почти исключительно как "$@"
, так как это расширяется до значения каждого позиционного параметра, указанного отдельно. Выражение "$@ somethingelse"
расширится до списка отдельно цитируемых позиционных параметров, а <space>somethingelse
будет добавлено к последнему из них.
Чтобы использовать значения позиционных параметров в виде одиночной строки , разделенной пробелами (или любым другим первым символом $IFS
, который может быть ), использование"$*"
("$* somethingelse"
правильно определено как одна строка ). Однако это не то, что вы хотите сделать в данном случае, так как это сведёт ваш список значений к одному единственному значению.