Kemungkinan untuk menggunakan brace (permutasi) dan ekspansi array secara bersamaan?

12

{}Sintaksis ekspansi brace Bash memungkinkan untuk membuat permutasi yang mudah

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

Namun tidak jelas bagi saya jika / bagaimana mungkin untuk menggunakan ini bersama dengan array kecuali dalam penggunaan $() echodaneval

Apakah ada cara sederhana untuk menggunakan array dengan curly brace (permutasi) ekspansi?

Misalnya sake, bayangkan sesuatu seperti (yang tidak berfungsi tentu saja):

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

echo {${CONS[@]}}{${VOWEL[@]}}
Catskul
sumber
itu berfungsi dalam GNU bash, version 4.2.24 Output root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.jika Anda ingin yang berbeda maka beri tahu kami .. `
Rahul Patil
3
@RahulPatil yang diinginkan OP ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Jawaban:

10

Anda dapat menggunakan eval with IFS=,; "${array[*]}"(yang menggabungkan nilai dengan koma) atau hanya dua untuk loop:

$ 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
Lri
sumber
9

Itu mungkin dengan 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

Atau 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

Dengan bashatau ksh93, Anda harus melakukan sesuatu yang berbelit-belit seperti:

VOWEL=( a e i o u )
CONS=( b c d )
qVOWEL=$(printf %q, "${VOWEL[@]}")
qCONS=$(printf %q, "${CONS[@]}")
eval "echo {${qVOWEL%,}}{${qCONS%,}}"
Stéphane Chazelas
sumber
2
Hanya satu alasan lagi untuk menggunakan zsh.
Kevin
Apakah Anda yakin tidak ada cara langsung untuk melakukannya di bash? Atau apakah Anda hanya curiga begitu?
Catskul
@Catskul, tidak, saya sangat meragukannya tapi saya tidak yakin, saya bahkan kurang yakin untuk ksh93 di mana sejumlah fitur tidak didokumentasikan. Anda mungkin ingin membiarkan pertanyaan terbuka untuk sementara waktu. Saya cukup yakin Anda tidak dapat melakukannya dengan ekspansi brace tanpa tingkat evaluasi lain (dengan evalatau .) sekalipun.
Stéphane Chazelas
eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Namun tidak bekerja untuk elemen tunggal.)
Rockallite
2

Menyenangkan, tapi mungkin bukan yang terbaik.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"
D.Fitz
sumber
Benar, tetapi mengharuskan pengulangan vokal, yang tidak tersirat dari pertanyaan (menetapkan daftar statis masing-masing ke CONS dan VOWEL).
Jeff Schaller