Làm thế nào để lặp qua các đối số trong một tập lệnh bash


16

Tôi muốn viết một tập lệnh bash với số lượng đối số không xác định.

Làm thế nào tôi có thể đi qua những tranh luận này và làm một cái gì đó với chúng?

Một nỗ lực sai sẽ như thế này:

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

Câu trả lời:


28

Có một cú pháp đặc biệt cho việc này:

for i do
  printf '%s\n' "$i"
done

Tổng quát hơn, danh sách các tham số của tập lệnh hoặc hàm hiện tại có sẵn thông qua biến đặc biệt $@.

for i in "$@"; do
  printf '%s\n' "$i"
done

Lưu ý rằng bạn cần dấu ngoặc kép xung quanh $@, nếu không các tham số trải qua quá trình mở rộng ký tự đại diện và tách trường. "$@"là ma thuật: mặc dù có dấu ngoặc kép, nó mở rộng ra nhiều trường như có các tham số.

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

Bạn nên trích dẫn $@bởi vì các đối số có thể chứa khoảng trắng (hoặc dòng mới, v.v.) nếu bạn trích dẫn chúng hoặc thoát chúng bằng a \. Ví dụ:

./myscript one 'two three'

Đó là hai đối số chứ không phải ba, do các trích dẫn. Nếu bạn không trích dẫn $@, những đối số đó sẽ bị phá vỡ trong tập lệnh.


2
Có một tốc ký cho điều nàyfor f; do ...
jackman jackman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.