Um shell POSIX possui uma única matriz: os parâmetros posicionais ( $1
, $2
,…), acessados coletivamente como "$@"
e definidos com set --
builtin. Mais precisamente, há uma matriz por instância de função na pilha de chamadas atual, mas somente a matriz de parâmetros posicionais da função atual (ou do script, se estiver fora de qualquer função) está acessível em qualquer ponto. Assim, se você quiser usar esse array, mas não estragar os parâmetros do script, trabalhe em uma função.
Como o sml já observou , seu caso de uso específico com o grep é mais simplesmente resolvido usando a opção -F
de grep para fazê-lo ler um padrão por linha de arquivo. Mas aqui está como você pode resolver o mesmo problema para um comando que não tem nada parecido com grep -F
.
set -- -a -b
while IFS= read -r line; do
set -- -e "$line"
done < "$dictionary"
mycommand "$@" more stuff
Isso chama mycommand -a -b line1 line2 … more stuff
.
Se você precisar manipular várias listas de nomes de arquivos (ou outras strings com conteúdo arbitrário), você pode fazê-lo com uso criterioso eval
e citações muito cuidadosas. Obtendo o cotando duro é complicado. A seguinte função leva dois argumentos: um nome de variável e uma string; ele acrescenta um formulário entre aspas da string à variável. O formulário citado é um literal com aspas simples, com aspas simples apropriadamente com escape e é adequado para análise de shell.
append_to_quoted_list () {
set -- "$1" "$(printf %s. "$2" | sed "s/'/'\\''/")"
eval "$1=\"\${$1} '${2%?}'\""
}
Aqui está um exemplo de uso, para construir duas listas ao mesmo tempo. Ele chama $command1
com as linhas passadas como argumentos para -e
opções e, em seguida, $command2
com as linhas passadas como --foo=…
opções.
list1= list2=
append_to_quoted_list list1 "$command1"
append_to_quoted_list list1 "$command2"
while IFS= read -r line; do
append_to_quoted_list list1 -e
append_to_quoted_list list1 "$line"
append_to_quoted_list list2 "--foo=$line"
done < "$dictionary"
eval "$list1; $list2"