Tôi đang viết một tập lệnh bash có một số tham số tùy chọn. Tôi muốn dịch chúng và chuyển chúng sang một kịch bản khác. Tuy nhiên, tôi đang gặp khó khăn khi chuyển các tham số tùy chọn một cách duyên dáng.Làm cách nào để chuyển các tham số tùy chọn cho một lệnh khác trong tập lệnh bash?
Dưới đây là một phác thảo của những gì tôi quản lý để làm việc trong giả:
a.sh:
if arg1 in arguments; then
firstArg="first argument"
fi
if arg2 in arguments; then
secondArg="second argument"
fi
./b.sh $firstArg $secondArg "default argument"
Lưu ý các khoảng trống trong các đối số.
b.sh:
for arg in "[email protected]"
do
echo $arg
done
Tôi muốn gọi b.sh
, tùy chọn với firstArg
và secondArg
và một đối số mặc định như vậy:
./b.sh $firstArg $secondArg "default argument"
Vấn đề ở đây là nếu $firstArg
hoặc $secondArg
là các chuỗi có dấu cách, chúng sẽ được biểu diễn dưới dạng nhiều đối số và đầu ra sẽ có dạng như sau:
first
argument
second
argument
default argument
Được rồi, đó là dễ dàng để sửa chữa, chúng ta hãy nắm bắt được toàn bộ chuỗi của các đối số bằng cách thêm dấu ngoặc kép quanh nó như vậy:
./b.sh "$firstArg" "$secondArg" "defaultArg"
Vấn đề là nếu, ví dụ, firstArg
không được thiết lập, nó kết quả trong một dòng trống (vì nó sẽ giải thích ""
như một tham số), do đó sản lượng sẽ được cái gì đó như:
(blank line here)
second argument
defaultArg
tôi cũng đã cố gắng xây dựng một chuỗi và đi qua nó để kịch bản shell, nhưng nó không dường như hoạt động theo cách đó (int erprets toàn bộ chuỗi như một đối số, ngay cả khi tôi thêm riêng biệt các đối số với dấu ngoặc kép).
Lưu ý rằng hãy gọi b.sh
từ dòng lệnh của tôi với các đối số được trích dẫn hoạt động tốt. Có cách nào để bắt chước cách hoạt động này từ bên trong một tập lệnh bash không?
Ngoài: Chỉ vì tôi sao chép dẫn của bạn và sử dụng 'mở rộng .sh' trên các tệp thực thi (tức là, các tệp có quyền + x đối với một cuộc gọi gia đình 'execv()' sẽ thành công) không có nghĩa đó là một ý tưởng hay. Nói chung, các lệnh trong UNIX không nên có bất kỳ phần mở rộng nào, cho dù chúng được cung cấp thông qua một kịch bản lệnh shell, một kịch bản Python, một nhị phân đã biên dịch, v.v. –
Bạn có thể làm rõ một cách rõ ràng xem mã này có sử dụng '#!/bin/sh' hoặc '#!/bin/bash'? –
Tôi đang sử dụng bash. – Andrew