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[@]}}

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

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%,}}"

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[@]}"

Benar, tetapi mengharuskan pengulangan vokal, yang tidak tersirat dari pertanyaan (menetapkan daftar statis masing-masing ke CONS dan VOWEL).
Jeff Schaller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.