Преобразование аргументов командной строки в массив в Bash
Как преобразовать аргументы командной строки в массив bash script?
Я хочу принять это:
./something.sh arg1 arg2 arg3
и преобразуйте его в
myArray=( arg1 arg2 arg3 )
чтобы я мог использовать myArray для дальнейшего использования в script.
Это предыдущее сообщение SO закрывается, но не идет о том, как создать массив: Как проанализировать аргументы командной строки в Bash?
Мне нужно преобразовать аргументы в обычный массив bash script; Я понимаю, что могу использовать другие языки (например, Python), но нужно сделать это в bash. Наверное, я ищу функцию "добавить" или что-то подобное?
UPDATE: я также хотел спросить, как проверить нулевые аргументы и присвоить значение массива по умолчанию, и, благодаря ответу ниже, смог заставить это работать:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "[email protected]" )
fi
Ответы
Ответ 1
На самом деле аргументы командной строки практически как массив уже. По крайней мере, вы можете рассматривать переменную [email protected]
так же, как массив. Тем не менее, вы можете преобразовать его в настоящий массив следующим образом:
myArray=( "[email protected]" )
Если вы просто хотите ввести некоторые аргументы и передать их в значение [email protected]
, используйте set
:
$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "[email protected]"
apple banana kiwi fruit
Понимание того, как использовать структуру аргументов, особенно полезно в POSIX sh, который не имеет ничего другого, как массив.
Ответ 2
Возможно, это может помочь:
myArray=("[email protected]")
также вы можете перебирать аргументы, опуская "in":
for arg; do
echo "$arg"
done
будет эквивалентным
for arg in "${myArray[@]}"; do
echo "$arg"
done
Ответ 3
На самом деле список параметров может быть доступен с $1 $2...
и т.д.
Что в точности эквивалентно:
${!i}
Итак, список параметров можно изменить с помощью set,
и ${!i}
- правильный способ доступа к ним:
$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll
В вашем конкретном случае это можно использовать (без использования массивов), чтобы установить список аргументов, когда ни один из них не был задан:
if [ "$#" -eq 0 ]; then
set -- defaultarg1 defaultarg2
fi
что переводит к этому еще более простому выражению:
[ "$#" == "0" ] && set -- defaultarg1 defaultarg2
Ответ 4
Вот еще одно использование:
#!/bin/bash
array=( "[email protected]" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
Ответ 5
Еще проще, вы можете работать напрямую на [email protected]
;)
Вот как можно передать список аргументов прямо из командной строки:
function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
Ответ 6
Параллельное представление о том, что массив и $ @практически одинаковы.
Код:
#!/bin/bash
echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: [email protected]"
echo ""
myArray=( "[email protected]" )
echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"
Входные данные:
./bash-array-practice.sh 1 2 3 4
Выход:
Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4
A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4
Ответ 7
Важность двойных кавычек стоит подчеркнуть. Предположим, что аргумент содержит пробел.
Код:
#!/bin/bash
printf 'arguments:%s\n' "[email protected]"
declare -a arrayGOOD=( "[email protected]" )
declare -a arrayBAAD=( [email protected] )
printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
echo "${arrayGOOD[$i-1]}"
done
printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
echo "${arrayBAAD[$i-1]}"
done
Выход:
> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and
arguments:the
arguments:mouse.
arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and
the
mouse.
arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
>