Làm thế nào để viết một kịch bản để chấp nhận bất kỳ số lượng đối số dòng lệnh? (UNIX, BASH)


1

Tôi có một kịch bản mà tôi muốn chấp nhận bất kỳ số lượng đối số dòng lệnh nào.

Cho đến nay tôi có

if [ -O $1 ] ; then
  echo "you are the owner of $1"
else
  echo "you are not the owner of $1"
fi

Rõ ràng nếu tôi muốn tập lệnh chỉ chấp nhận một đối số thì điều này sẽ hoạt động nhưng điều gì sẽ hoạt động với BẤT K number số lượng đối số.

ex.  ./script f f1 f2 f3

1
Nếu một cái gì đó trả lời câu hỏi của bạn, bạn có thể đánh dấu nó là câu trả lời (nhấp vào dấu chọn)? Cảm ơn.
jtbandes

Câu trả lời:


10

Một cách có thể để làm những gì bạn muốn liên quan $@, đó là một mảng của tất cả các đối số được truyền vào.

for item in "$@"; do
  if [ -O "$item" ]; then
    echo "you are the owner of $item"
  else
    echo "you are not the owner of $item"
  fi
done

3
Ừm, xem điều gì xảy ra khi bạn chạy script "arg with spaces". Nó có thể hoặc có thể không liên quan đến tình huống của bạn. Khi bạn đã hoàn tất, hãy đặt doublequote xung quanh $@$item.
wfaulk

Điểm tốt. Đã sửa.
jtbandes

3

Vâng, nó phụ thuộc vào chính xác những gì bạn muốn làm, nhưng nhìn vào $*, $@shift.


2

"$ @" Không giải quyết được vấn đề của anh ấy về "BẤT K number số lượng đối số". có giới hạn về thời gian của một dòng lệnh ( http://www.in-ulm.de/~mascheck/various/argmax/ ). một cách tốt hơn để đọc trong "đối số không giới hạn" là thông qua STDIN:

prg_which_creates_arguments | while read a; do \
    echo "do something with $a"; \
done

chỉ cần tạo các đối số và nối tiếp chúng với nhau theo mã đang làm gì đó với chúng.

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.