Tôi chưa bao giờ làm điều này trước đây nhưng nhìn thấy điều này và tôi đã học được điều gì đó. Bạn sẽ cần phải sử dụng bash
getopts
chức năng như vậy. Điều này sẽ chỉ cho bạn đi đúng hướng:
while getopts i:f:c:h:u: option
do
case "${option}"
in
i) ip=${OPTARG};;
f) state=${OPTARG};;
c) cpu=${OPTARG};;
h) host=$OPTARG;;
u) user=$OPTARG;;
esac
done
Đây là một vòng lặp while sử dụng getopts
hàm và cái gọi là optstring
, trong trường hợp này i:f:c:h:u:
, để lặp qua các đối số. Vòng lặp while đi qua optstring
, trong đó có các cờ có thể được sử dụng để truyền các đối số và gán giá trị đối số được cung cấp cho cờ đó cho biến option
. Sau đó, câu lệnh case gán giá trị của biến option
cho biến toàn cục có thể được sử dụng sau khi tất cả các đối số đã được đọc.
Các dấu hai chấm optstring
có nghĩa là các giá trị được yêu cầu cho các cờ tương ứng. Trong ví dụ trên, tất cả các cờ được theo sau bởi dấu hai chấm : i:f:c:h:u:
.
Điều này có nghĩa, tất cả các cờ cần một giá trị. Ví dụ, nếu i
và các u
cờ không được mong đợi có giá trị, thì chuỗi sẽ là i:f:c:h:u
.
Ví dụ :i:f:c:h:u:
, một dấu hai chấm ở đầu chuỗi , có một ý nghĩa hoàn toàn khác. Nó cho phép bạn xử lý các cờ không được biểu thị trong chuỗi opt. Trong trường hợp đó, giá trị của biến "tùy chọn" được đặt thành "?" và giá trị của "OPTARG" được đặt thành cờ không mong muốn. Cho phép bạn hiển thị một thông báo lỗi phù hợp thông báo cho người dùng về lỗi.
Các đối số không có trước cờ được bỏ qua bởi các getopts. Nếu các cờ được chỉ định trong chuỗi quang không được cung cấp khi tập lệnh được gọi, không có gì xảy ra, trừ khi bạn đặc biệt xử lý trường hợp này trong mã của mình.
Bất kỳ đối số không được xử lý bởi getops
vẫn có thể được chụp bằng thường xuyên $1
, $2
vv biến.
Ví dụ đơn giản:
#!/bin/bash
while getopts "i:f:c:h:u:" opt
do
case $opt in
i)
echo "ip"
;;
f)
echo "free"
;;
c)
echo "cpu"
;;
h)
echo "host"
;;
u)
echo "user"
;;
*)
echo "Nothing to do"
;;
esac
done
Sử dụng:
./h.sh -i ip -f free -c cpu -h host -u user
Kết quả:
ip
free
cpu
host
user
Nguồn:
https://www.lifewire.com/pass-argument-to-bash-script-2200571
http://aplawrence.com/Unix/getopts.html
http://mywiki.wooledge.org/BashFAQ/035#getopts
http://mywiki.wooledge.org/ComplexOptionParsing