Как преобразовать аргументы командной строки в массив скриптов bash?
Я хочу взять это:
./something.sh arg1 arg2 arg3
и преобразовать его в
myArray=( arg1 arg2 arg3 )
так что я могу использовать myArray для дальнейшего использования в сценарии.
Этот предыдущий пост SO близок, но не касается того, как создать массив: как мне проанализировать аргументы командной строки в Bash?
Мне нужно преобразовать аргументы в обычный массив скриптов bash; Я понимаю, что могу использовать другие языки (например, Python), но нужно сделать это в bash. Я думаю, я ищу функцию "добавить" или что-то подобное?
ОБНОВЛЕНИЕ: я также хотел спросить, как проверить на нулевые аргументы и назначить значение массива по умолчанию, и благодаря ответу ниже, смог заставить это работать:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
позволяет установить позиционные параметры для области. Это также позволяет вам устанавливать параметры оболочки. Вы можете сделать этоset foo
, что будет означать$1
расширение до "foo", но если ваши параметры начинаются с тире,set
вы предполагаете, что вы хотите установить параметр оболочки. Двойная черта гарантирует, что все следующие параметры будут интерпретированы как позиционные параметры, которые будут установлены.echo $@
напечатает все аргументы, ноecho $myArray
напечатает только первый элемент. Чтобы увидеть их все, используйтеecho ${myArray[@]}
."${myArray[@]}"
. Если вы хотите перебрать массив, вам нужны кавычки, чтобы не разбивать его отдельные элементы на IFSМожет быть, это может помочь:
также вы можете перебирать аргументы, опуская 'in':
будет эквивалентно
источник
arg
поле - это предопределенная переменная?${var}
расширяется до содержанияvar
.${var[n]}
расширяется до содержимого элементаn
массиваvar
. Является ли${var[@]}
то расширение всего массива, т.е.${var[0]} ${var[1]} ... ${var[n]}
(сn
являющийся индексом последнего элемента)?На самом деле список параметров может быть доступен с помощью
$1 $2 ...
и т. Д.Что в точности эквивалентно:
Итак, список параметров можно изменить с помощью set,
и
${!i}
это правильный способ доступа к ним:В вашем конкретном случае это можно использовать (без необходимости использования массивов), чтобы установить список аргументов, когда ни один из них не был задан:
что переводит к этому еще более простому выражению:
источник
echo "$#" "$i+1" "${!i}";
получить вывод точно так, как показано?Вот еще одно использование:
источник
Еще проще, вы можете оперировать напрямую
$@
;)Вот как можно передать список аргументов непосредственно из командной строки:
источник
for stuff in "$@" ; do ...
же, какfor stuff ; do ...
:)Параллельное представление о том, что массив и $ @ практически одинаковы.
Код:
Входные данные:
Вывод:
источник
Важность двойных кавычек стоит подчеркнуть. Предположим, что аргумент содержит пробел.
Код:
Вывод:
источник