Possible to use brace (permutation) and array expansion simultaneously?

Cat*_*kul 13 bash shell-script brace-expansion shell-builtin

Bash's {} brace expansion syntax allows for creating easy permutations

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

However it's not clear to me if/how it's possible to use this along with arrays except in very awkward use of $() echo and eval

Is there a simple way to use arrays with curly brace (permutation) expansion?

例如,想象一下(当然这不起作用):

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

echo {${CONS[@]}}{${VOWEL[@]}}
Run Code Online (Sandbox Code Playgroud)

Lri*_*Lri 11

您可以使用 eval with IFS=,; "${array[*]}"(用逗号连接值)或仅使用两个 for 循环:

$ 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
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 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
Run Code Online (Sandbox Code Playgroud)

或者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
Run Code Online (Sandbox Code Playgroud)

使用bashor ksh93,您必须做一些令人费解的事情,例如:

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

  • 还有一个使用 zsh 的理由。 (2认同)