Чи можливо одночасно використовувати дужку (перестановку) та розширення масиву?


12

{}Синтаксис розширення дужок Bash дозволяє створювати легкі перестановки

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

Однак мені незрозуміло, чи / як можна використовувати це разом з масивами, за винятком дуже незручного використання $() echoтаeval

Чи існує простий спосіб використання масивів з фігурною дужкою (перестановка) розширенням?

Наприклад заради, уявіть щось на зразок (що, звичайно, не працює):

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

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

це працює в GNU bash, version 4.2.24 Output, root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.якщо ви хочете іншого, то повідомте нам про це. ''
Rahul Patil

3
@RahulPatil ОП хоче ba be bi bo bu ca ce ci co cu da de di do du.
тердон

Відповіді:


10

Ви можете використовувати eval with IFS=,; "${array[*]}"(який з'єднує значення з комами) або лише два для циклів:

$ 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

Це можливо за допомогою 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

Або 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

З bashабо ksh93, вам доведеться зробити щось складене на кшталт:

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

2
Ще один привід використовувати zsh.
Кевін

Ви впевнені, що немає більш прямого способу зробити це в башті? Або ви просто підозрюєте, що це так?
Кацкуль

@Catskul, ні, я дуже сумніваюся в цьому, але я не впевнений, я навіть менш впевнений у ksh93, де ряд функцій не задокументований. Ви можете залишити питання на деякий час відкритим. Я впевнений, що ви не можете зробити це з розширенням дужок без іншого рівня оцінки (з evalабо .).
Стефан Шазелас

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Хоча не працює над одним елементом.)
Rockallite

2

Весело, але, мабуть, не найкраще.

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

Це правда, але вимагає повторення голосних, що не випливає з питання (призначення статичного списку CONS та VOWEL кожен).
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.