É possível usar expansão de braçadeira (permutação) e matriz simultaneamente?


12

A {}sintaxe de expansão de chaves do Bash permite criar permutações fáceis

# echo {b,c,d}{a,e,i,o,u}
ba be bi bo bu ca ce ci co cu da de di do du

No entanto, não está claro para mim se / como é possível usar isso junto com matrizes, exceto no uso muito estranho de $() echoeeval

Existe uma maneira simples de usar matrizes com expansão de chave (permutação)?

Por exemplo, imagine algo como (o que não funciona, é claro):

CONS=( b c d )
VOWEL=( a e i o u )

echo {${CONS[@]}}{${VOWEL[@]}}

ele está trabalhando na GNU bash, version 4.2.24 saída root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}., se quiser diferente, então deixe-nos saber .. `
Rahul Patil

3
@RahulPatil o OP quer ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Respostas:


10

Você pode usar eval with IFS=,; "${array[*]}"(que une os valores com vírgulas) ou apenas dois para loops:

$ CONS=(b c d);VOWEL=(a e i o u)
$ IFS=,;eval echo "{${CONS[*]}}{${VOWEL[*]}}"
ba be bi bo bu ca ce ci co cu da de di do du
$ for c in "${CONS[@]}";do for v in "${VOWEL[@]}";do echo "$c$v";done;done|paste -sd' ' -
ba be bi bo bu ca ce ci co cu da de di do du

9

É possível com zsh:

$ CONS=( b c d )
$ VOWEL=( a e i o u )
$ echo $^CONS$^VOWEL
ba be bi bo bu ca ce ci co cu da de di do du

Ou es:

; VOWEL=( a e i o u )
; CONS=( b c d )
; echo $VOWEL^$CONS
ab ac ad eb ec ed ib ic id ob oc od ub uc ud

Com bashou ksh93, você teria que fazer algo complicado como:

VOWEL=( a e i o u )
CONS=( b c d )
qVOWEL=$(printf %q, "${VOWEL[@]}")
qCONS=$(printf %q, "${CONS[@]}")
eval "echo {${qVOWEL%,}}{${qCONS%,}}"

2
Apenas mais um motivo para usar o zsh.
Kevin

Você tem certeza de que não há maneira mais direta de fazer isso no bash? Ou você apenas suspeita que é assim?
Catskul 16/09

@ Catskul, não, eu duvido muito, mas não tenho certeza, tenho ainda menos certeza sobre o ksh93, onde vários recursos não estão documentados. Você pode deixar a pergunta em aberto por um tempo. Tenho certeza de que você não pode fazê-lo com expansão de chaves sem outro nível de avaliação (com evalou .).
Stéphane Chazelas

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Não funciona para um único elemento embora.)
Rockallite

2

Divertido, mas provavelmente não o melhor.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"

É verdade, mas requer repetir as vogais, o que não está implícito na pergunta (atribuir uma lista estática a CONS e VOWEL cada).
Jeff Schaller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.