ก่อนอื่นโปรดทราบว่า$@
หากไม่มีเครื่องหมายอัญประกาศก็ไม่สมเหตุสมผลและไม่ควรใช้ $@
ควรใช้เครื่องหมายคำพูด ( "$@"
) และในบริบทรายการเท่านั้น
for i in "$@"
มีคุณสมบัติเป็นบริบทรายการ แต่ที่นี่เพื่อวนซ้ำพารามิเตอร์ตำแหน่งรูปแบบที่ยอมรับได้แบบพกพาและเรียบง่ายที่สุดคือ:
for i
do something with "$i"
done
ตอนนี้การวนซ้ำองค์ประกอบเริ่มต้นจากวิธีที่สองวิธีบัญญัติและแบบพกพามากที่สุดคือการใช้shift
:
first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done
หลังจากนั้นshift
สิ่งที่เคย$1
ถูกลบออกจากรายการ (แต่เราได้บันทึกไว้ใน$first_arg
) และสิ่งที่เคยเป็นอยู่ใน$2
ตอนนี้$1
มา พารามิเตอร์ตำแหน่งถูกเลื่อน 1
ตำแหน่งไปทางซ้าย (ใช้shift 2
เพื่อเลื่อน 2 ... ) โดยพื้นฐานแล้วการวนซ้ำของเรากำลังวนซ้ำจากสิ่งที่เคยเป็นอาร์กิวเมนต์ที่สองถึงครั้งสุดท้าย
ด้วยbash
(และzsh
และksh93
แต่ก็เท่านั้น) ทางเลือกอื่นคือ:
for i in "${@:2}"
do something with "$i"
done
แต่ทราบว่ามันไม่ได้มาตรฐานไวยากรณ์จึงไม่ควรนำมาใช้ในสคริปต์ที่เริ่มต้นด้วยsh
#! /bin/sh -
ในzsh
หรือyash
คุณยังสามารถทำสิ่งต่อไปนี้
for i in "${@[3,-3]}"
do something with "$i"
done
เพื่อวนซ้ำจากข้อโต้แย้งครั้งที่ 3 ถึงครั้งที่ 3
ในzsh
, $@
นอกจากนี้ยังเป็นที่รู้จักกันเป็น$argv
อาร์เรย์ ดังนั้นเมื่อต้องการอิลิเมนต์ pop จากจุดเริ่มต้นหรือจุดสิ้นสุดของอาร์เรย์คุณยังสามารถทำสิ่งต่อไปนี้
argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()
( shift
นอกจากนี้ยังสามารถเขียน1=()
ในzsh
)
ในbash
คุณสามารถกำหนด$@
องค์ประกอบให้กับset
builtin ได้เท่านั้นดังนั้นเมื่อต้องการปิดองค์ประกอบ 3 องค์ประกอบท้ายสุดซึ่งจะเป็นดังนี้:
set -- "${@:1:$#-3}"
และวนซ้ำจากอันดับ 3 ถึงอันดับ 3
for i in "${@:3:$#-5}"
do something with "$i"
done
POSIXly หากต้องการแสดงองค์ประกอบ 3 รายการสุดท้าย"$@"
คุณจะต้องใช้การวนซ้ำ:
n=$(($# - 3))
for arg do
[ "$n" -gt 0 ] && set -- "$@" "$arg"
shift
n=$((n - 1))
done
for ((i=2; i<=$#; i++)); do something with "${!i}"; done