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: $0có 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/scripthoặ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 getoptsvà shift. getoptsrất giống getopt()chức năng thư viện C. shiftdi 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ố $2thứ 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 ... esacsẽ đủ.
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ưnggetoptthực thi không giống nhau trên nền tảng / bản phân phối. Tôi hiện làgetoptsngườ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