bash
é bastante limitado nessa frente. Você pode querer experimentar outros shells.
Com zsh
(você já está usando a sintaxe zsh
porque não citou suas variáveis em command $NAME $URL
):
for name url (
name1 url1
name2 url2
name3 url3
) command $name $url
Com bash
ou outro shell POSIX, você poderia fazer:
while IFS=, read <&3 -r name url; do
{
command "$name" "$url"
} 3<&-
done 3<< "EOF"
name1,url1
name2,url2
name3,url3
EOF
Isso significa que os valores não podem conter vírgulas ou novas linhas.
Versões recentes de bash
também suportam matrizes associativas usando uma sintaxe mais parecida com a de ksh93 do que com zsh
. Então, se os nomes são únicos, você poderia fazer:
typeset -A pairs
pairs=(
[name1]=url1
[name2]=url2
[name3]=url3
)
for name in "${!pairs[@]}"; do
url=${pairs[$name]}
command "$name" "$url"
done
Isso também funcionaria em ksh93
. Cuidado com as regras de cotação variam ligeiramente entre ambos. Em zsh
, a sintaxe de definição de matriz associativa é mais direta e as regras normais de cotação se aplicam:
pairs=(name1 url1 name2 url2 name3 url3)
Que você pode colocar em várias linhas:
pairs=(
name1 url1
name2 url2
name3 url3
)
Tenha em atenção que a encomenda não está preservada e que bash
matrizes associativas não suportam uma chave vazia.
ksh93
suporta matrizes multidimensionais, pelo que pode fazê-lo:
pairs=((name1 url1) (name2 url2) (name3 url3))
for ((i = 0; i < ${#pairs[@]}; i++)); do
name=${pairs[i][o]} url=${pairs[i][1]}
command "$name" "$url"
done