괄호 (순열)와 배열 확장을 동시에 사용할 수 있습니까?


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

/이 가능 방법이 매우 어색 사용을 제외하고 배열과 함께이를 사용하는 경우는 나에게 분명하지 않다 $() echoeval

중괄호 확장과 함께 배열을 사용하는 간단한 방법이 있습니까?

예를 들어 (물론 작동하지 않음)과 같은 것을 상상해보십시오.

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}.있습니다. ..
Rahul Patil

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

답변:


10

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

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또는 포함 .)가 없으면 중괄호 확장 으로이 작업을 수행 할 수 없다고 확신합니다 .
Stéphane 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에 정적 목록 지정).
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.