Có thể sử dụng nẹp (hoán vị) và mở rộng mảng đồng thời?


12

{}Cú pháp mở rộng cú đúp của Bash cho phép tạo các hoán vị dễ dàng

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

Tuy nhiên tôi không rõ nếu / làm thế nào có thể sử dụng nó cùng với các mảng ngoại trừ việc sử dụng $() echoeval

Có một cách đơn giản để sử dụng các mảng với mở rộng dấu ngoặc nhọn (hoán vị)?

Ví dụ: sake, hãy tưởng tượng một cái gì đó như (tất nhiên không hoạt động):

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

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

nó hoạt động ở GNU bash, version 4.2.24 đầu ra root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.nếu bạn muốn khác biệt thì hãy cho chúng tôi biết .. `
Rahul Patil

3
@RahulPatil OP muốn ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Câu trả lời:


10

Bạn có thể sử dụng eval với IFS=,; "${array[*]}"(nối các giá trị bằng dấu phẩy) hoặc chỉ hai cho các vòng lặp:

$ 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

Có thể với 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

Hoặc 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

Với bashhoặc ksh93, bạn sẽ phải làm một cái gì đó phức tạp như:

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

2
Chỉ cần một lý do nữa để sử dụng zsh.
Kevin

Bạn có chắc chắn rằng không có cách trực tiếp hơn để làm điều đó trong bash? Hay bạn chỉ nghi ngờ rằng nó là như vậy?
Catskul

@Catskul, không, tôi cực kỳ nghi ngờ điều đó nhưng tôi không chắc chắn, tôi thậm chí còn ít chắc chắn hơn đối với ksh93 khi một số tính năng không được ghi lại. Bạn có thể muốn để lại câu hỏi mở trong một thời gian. Tôi khá chắc chắn rằng bạn không thể làm điều đó với mở rộng cú đúp mà không có một mức độ đánh giá khác (với evalhoặc .).
Stéphane Chazelas

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Không hoạt động cho một yếu tố duy nhất.)
Rockallite

2

Vui, nhưng có lẽ không phải là tốt nhất.

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

Đúng, nhưng yêu cầu lặp lại các nguyên âm, không được ngụ ý từ câu hỏi (gán một danh sách tĩnh cho TIÊU DÙNG và VOWEL mỗi nguyên âm).
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.