Czy możliwe jest jednoczesne użycie nawiasu klamrowego i rozszerzenia tablicy?


12

{}Składnia rozwinięcia nawiasu klamrowego Bash pozwala na tworzenie łatwych permutacji

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

Jednak nie jest dla mnie jasne, czy / jak można tego używać wraz z tablicami, z wyjątkiem bardzo niewygodnego użycia $() echoieval

Czy istnieje prosty sposób korzystania z tablic z rozszerzaniem nawiasów klamrowych (permutacji)?

Na przykład, wyobraź sobie coś takiego (co oczywiście nie działa):

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

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

działa w GNU bash, version 4.2.24 Output, root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.jeśli chcesz inaczej, daj nam znać ...
Rahul Patil

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

Odpowiedzi:


10

Możesz użyć eval z IFS=,; "${array[*]}"(który łączy wartości przecinkami) lub tylko dwóch dla pętli:

$ 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

Jest to możliwe dzięki 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

Lub 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

Za pomocą bashlub ksh93musisz zrobić coś skomplikowanego, na przykład:

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

2
Jeszcze jeden powód, aby używać zsh.
Kevin

Czy jesteś pewien, że nie ma bardziej bezpośredniego sposobu na zrobienie tego w bashu? A może po prostu podejrzewasz, że tak jest?
Catskul

@Catskul, nie, mocno w to wątpię, ale nie jestem pewien, jeszcze mniej jestem pewien dla ksh93, gdzie wiele funkcji nie jest udokumentowanych. Być może zechcesz pozostawić pytanie otwarte. Jestem pewien, że nie da się tego zrobić z rozszerzeniem nawiasów bez innego poziomu oceny (z evallub .).
Stéphane Chazelas,

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Nie działa jednak na pojedynczy element.)
Rockallite

2

Zabawne, ale prawdopodobnie nie najlepsze.

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

To prawda, ale wymaga powtórzenia samogłosek, co nie wynika z pytania (przypisanie statycznej listy do CONS i VOWEL).
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.