เมื่อคุณใช้การขยายรั้งในทุบตีสิ่งที่ต้องการ
echo {a,b,c}
กลายเป็น
echo a b c
มีวิธีขยายคำสั่งเป็น 3 คำสั่งแยกกันหรือไม่สำหรับแต่ละส่วนขยาย
ดังนั้น:
echo {a,b,c}
จะกลายเป็น
echo a
echo b
echo c
เมื่อคุณใช้การขยายรั้งในทุบตีสิ่งที่ต้องการ
echo {a,b,c}
กลายเป็น
echo a b c
มีวิธีขยายคำสั่งเป็น 3 คำสั่งแยกกันหรือไม่สำหรับแต่ละส่วนขยาย
ดังนั้น:
echo {a,b,c}
จะกลายเป็น
echo a
echo b
echo c
คำตอบ:
นี่เป็นเพียงคำถาม "เพราะฉันอยากรู้" หรือมีกรณีการใช้งานจริงหรือ? เราสามารถผ่านยิมนาสติกเพื่อทำมันให้เสร็จ:
$ eval echo\ {a,b,c}\;
a
b
c
แต่ฉันจะตามหาใครก็ตามที่ใส่คำสั่งที่น่ารังเกียจเหล่านี้ลงในสคริปต์ระบบของเรา
ทำไมไม่ไปเพื่อความชัดเจนแทน:
$ for X in {a,b,c}; do echo $X; done
คุณสามารถทำได้ทั้งหมูตัวเมียและใส่บรรทัดใหม่และเยื้องเข้าไปเล็กน้อยเพื่อให้คุณสามารถเข้าใจสิ่งที่คุณพยายามทำอยู่เสมอ
for
ทำงานสำหรับสิ่งนี้ แต่ก็ยังมีการพิมพ์เพิ่มเติม: P
eval git branch -d \{ branch-a, branch-b }\;
จากคำตอบที่เลือกของ Mark Mannฉันสามารถได้รับตัวอย่างนี้ซึ่งใช้งานได้ดียิ่งขึ้น:
$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak
สิ่งที่แสดงคือเมื่อคุณใช้หลายครั้งของการขยายรั้งภายในบรรทัดตัวอย่างดั้งเดิมของ Mark จะพิมพ์ทุกรูปแบบทีละรายการ แต่ฉันต้องการใช้คำตอบของเขาเพื่อย้าย / เปลี่ยนชื่อหลายไฟล์ เพื่อให้แน่ใจว่าผลลัพธ์ที่ตรงกับรูปแบบที่mv
ปกติคาดหวัง ( mv oldfilename newfilename
) ฉันหนีการเกิดขึ้นครั้งที่สองของการขยายรั้งเพื่อที่จะไม่ได้รับการประเมินจนกระทั่งหลังจากeval
คำสั่งเริ่มต้นได้ดำเนินการ
เนื่องจากเอาต์พุตข้างต้นปรากฏขึ้นตามที่คาดไว้ฉันจึงสามารถเรียกใช้คำสั่งต่อไปนี้:
$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak category_32.properties.bak category_33.properties.bak
ขอบคุณ Mark มากสำหรับคำตอบดั้งเดิมของเขา โปรดโหวตคำตอบของเขาถ้าคุณชอบสิ่งที่คำตอบของเขาอนุญาตให้ฉันทำ :-)
file-{r,b,g}{m,n,o}{x,y.z}.foo
นั้นล่ะก็ให้ใช้รูปแบบสั้นกว่าการแจกแจงค่าทั้งหมด 27