เป็นไปได้ที่จะใช้วงเล็บปีกกา (การเปลี่ยนรูป) และการขยายอาร์เรย์พร้อมกันไหม


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ต้องการสหกรณ์
terdon

คำตอบ:


10

คุณอาจใช้ eval with 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
Kevin

คุณแน่ใจหรือว่าไม่มีวิธีโดยตรงในการทุบตี? หรือคุณเพียงแค่สงสัยว่ามันเป็นเช่นนั้น?
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 และสระแต่ละสระ)
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.