ฉันต้องการเขียนสคริปต์ทุบตีด้วยจำนวนอาร์กิวเมนต์ที่ไม่รู้จัก
ฉันจะเดินผ่านข้อโต้แย้งเหล่านี้และทำอะไรกับพวกเขาได้อย่างไร
ความพยายามที่ผิดจะมีลักษณะเช่นนี้:
#!/bin/bash
for i in $args; do
echo $i
done
ฉันต้องการเขียนสคริปต์ทุบตีด้วยจำนวนอาร์กิวเมนต์ที่ไม่รู้จัก
ฉันจะเดินผ่านข้อโต้แย้งเหล่านี้และทำอะไรกับพวกเขาได้อย่างไร
ความพยายามที่ผิดจะมีลักษณะเช่นนี้:
#!/bin/bash
for i in $args; do
echo $i
done
คำตอบ:
มีรูปแบบพิเศษสำหรับสิ่งนี้:
for i do
printf '%s\n' "$i"
done
$@
โดยทั่วไปรายชื่อของพารามิเตอร์ของสคริปต์ปัจจุบันหรือฟังก์ชั่นที่มีอยู่ผ่านตัวแปรพิเศษ
for i in "$@"; do
printf '%s\n' "$i"
done
โปรดทราบว่าคุณต้องการอัญประกาศล้อมรอบ$@
มิฉะนั้นพารามิเตอร์จะได้รับการขยายสัญลักษณ์และการแยกฟิลด์ "$@"
is magic: แม้จะมีเครื่องหมายคำพูดคู่ แต่ก็ขยายออกเป็นหลายเขตข้อมูลตามที่มีพารามิเตอร์
print_arguments () {
for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special !\characters' '-n' # prints 4 lines
print_arguments '' # prints one empty line
print_arguments # prints nothing
#! /usr/bin/env bash
for f in "$@"; do
echo "$f"
done
คุณควรจะพูด$@
เพราะมันเป็นไปได้สำหรับข้อโต้แย้งที่จะมีช่องว่าง (หรือการขึ้นบรรทัดใหม่ ฯลฯ ) \
ถ้าคุณพูดพวกเขาหรือหลบหนีพวกเขาด้วย ตัวอย่างเช่น:
./myscript one 'two three'
นั่นคือสองข้อโต้แย้งมากกว่าสามข้อ หากคุณไม่ได้อ้าง$@
ถึงข้อโต้แย้งเหล่านั้นจะถูกทำลายภายในสคริปต์
for f; do ...