Можно ли использовать скобки (перестановку) и расширение массива одновременно?


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 с 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.
Кевин

Вы уверены, что в bash нет более прямого способа сделать это? Или вы просто подозреваете, что это так?
Catskul

@ 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.