可以同时使用大括号(排列)和数组扩展吗?


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

但是我不清楚是否/如何将其与数组一起使用,除非非常笨拙地使用$() echoandeval

有没有一种简单的方法可以将数组与花括号(排列)扩展一起使用?

例如,想象一下类似的事情(这当然不起作用):

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

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

它的工作的GNU bash, version 4.2.24 输出root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.,如果你想不同的,那么让我们知道..`
拉胡尔·帕蒂尔

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

Answers:


10

您可以将eval与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

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

使用bashksh93,您必须做一些复杂的事情:

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

2
使用zsh的另一个原因。
凯文(Kevin)

您确定没有其他直接方法可以执行bash吗?还是您只是怀疑是这样?
Catskul 2013年

@Catskul,不,我对此表示强烈怀疑,但我不确定,对于ksh93(其中未记录许多功能),我甚至不确定。您可能需要暂时保留问题。我敢肯定,如果没有其他评估级别(带有eval.),就无法通过大括号扩展来做到这一点。
斯特凡Chazelas

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)。
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.