วิธีการวนซ้ำอาร์กิวเมนต์ในสคริปต์ทุบตี


16

ฉันต้องการเขียนสคริปต์ทุบตีด้วยจำนวนอาร์กิวเมนต์ที่ไม่รู้จัก

ฉันจะเดินผ่านข้อโต้แย้งเหล่านี้และทำอะไรกับพวกเขาได้อย่างไร

ความพยายามที่ผิดจะมีลักษณะเช่นนี้:

#!/bin/bash
for i in $args; do 
    echo $i
done

คำตอบ:


28

มีรูปแบบพิเศษสำหรับสิ่งนี้:

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

5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

คุณควรจะพูด$@เพราะมันเป็นไปได้สำหรับข้อโต้แย้งที่จะมีช่องว่าง (หรือการขึ้นบรรทัดใหม่ ฯลฯ ) \ถ้าคุณพูดพวกเขาหรือหลบหนีพวกเขาด้วย ตัวอย่างเช่น:

./myscript one 'two three'

นั่นคือสองข้อโต้แย้งมากกว่าสามข้อ หากคุณไม่ได้อ้าง$@ถึงข้อโต้แย้งเหล่านั้นจะถูกทำลายภายในสคริปต์


2
มีชวเลขสำหรับเรื่องนี้for f; do ...
เกล็นแจ็คแมน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.