Câu trả lời:
Các lệnh shell và bất kỳ đối số cho lệnh đó xuất hiện như đánh số các biến shell: $0
có giá trị chuỗi của lệnh riêng của mình, một cái gì đó giống như script
, ./script
, /home/user/bin/script
hoặc bất cứ điều gì. Bất kỳ đối số xuất hiện như "$1"
, "$2"
, "$3"
và vân vân. Số lượng đối số là trong biến shell "$#"
.
Các cách phổ biến để xử lý việc này liên quan đến các lệnh shell getopts
và shift
. getopts
rất giống getopt()
chức năng thư viện C. shift
di chuyển các giá trị của $2
để $1
, $3
để $2
, và vân vân; $#
được giảm giá. Mã kết thúc lên nhìn vào giá trị của "$1"
, làm việc bằng cách sử dụng case
... esac
để quyết định một hành động, và sau đó làm một shift
để di chuyển $1
đến các số tiếp theo. Nó chỉ bao giờ phải kiểm tra $1
, và có thể $#
.
$/shellscriptname.sh argument1 argument2 argument3
Bạn cũng có thể chuyển đầu ra của một tập lệnh shell làm đối số cho tập lệnh shell khác.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
Trong shell script, bạn có thể truy cập các đối số với các số như $1
đối số $2
thứ nhất và đối số thứ hai, v.v.
Hình thức
$ ./script.sh "$@"
là thuận tiện nhất cho argv
. Dấu phân cách arg là khoảng trắng, nhưng có thể thay đổi. Đừng nhớ làm thế nào ra tay. Sau đó sử dụng
$1, $2, shift, if [ $# -ne 3 ]
để kiểm soát dòng chảy. Tôi thường không nắm lấy getopts nếu case ... esac
sẽ đủ.
Trên tập lệnh bash, cá nhân tôi thích sử dụng tập lệnh sau để đặt tham số:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
Với cấu trúc này, chúng tôi không dựa vào thứ tự của các tham số, vì chúng tôi đang xác định một chữ cái chính cho mỗi một tham số. Ngoài ra, chức năng trợ giúp sẽ được in tất cả các lần mà các tham số được xác định sai. Nó rất hữu ích khi chúng ta có rất nhiều tập lệnh với các tham số khác nhau để xử lý. Nó hoạt động như sau:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
Trong kịch bản shell; nó trở thành tên biến $ 1. Từ thứ hai trở thành tên biến $ 2 và cứ thế.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Có thể tìm thấy nhiều hơn trong hướng dẫn sử dụng shell (sh) tại http://heirloom.sourceforge.net/sh/sh.1.html
Nếu bạn quen thuộc với Python argparse và không ngại gọi python để phân tích các đối số bash, hãy sử dụng bash argparse ( https://github.com/mattbryson/bash-arg-parse ),
Xem câu trả lời tương tự tại đây: https://stackoverflow.com/questions/7069682/how-to-get-argument-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) không thêm bất cứ điều gì vào câu trả lời hiện có.
getopt()
là một tiêu chuẩn cực kỳ được thiết lập, nhưnggetopt
thực thi không giống nhau trên nền tảng / bản phân phối. Tôi hiện làgetopts
người dùng được chuyển đổi hoàn toàn , vì đây là tiêu chuẩn POSIX. Nó cũng hoạt động rất tốtdash
, đó là vỏ kịch bản ưa thích của tôi