Làm thế nào tôi có thể chuyển một đối số dòng lệnh vào một tập lệnh shell?


243

Tôi biết rằng các kịch bản shell chỉ chạy các lệnh như thể chúng được thực thi tại dấu nhắc lệnh. Tôi muốn có thể chạy các tập lệnh shell như thể chúng là các hàm ... Nghĩa là lấy một giá trị đầu vào hoặc chuỗi vào tập lệnh. Làm thế nào để tôi tiếp cận làm điều này?

Câu trả lời:


199

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 getoptsshift. 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ể $#.


6
C getopt()là một tiêu chuẩn cực kỳ được thiết lập, nhưng getoptthự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ốt dash, đó là vỏ kịch bản ưa thích của tôi
JM Becker

165

Bạn có thể truy cập các đối số được truyền với số đối số $nở đâu n- 1, 2, 3, .... Bạn truyền các đối số giống như bạn làm với bất kỳ lệnh nào khác.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/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.

Thêm về đối số shell


18

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ẽ đủ.


14

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

13
./myscript myargument

myargumenttrở thành $1bên trong myscript.


5

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


2
Chào mừng bạn đến với U & L, điều này hầu như không thêm bất cứ điều gì vào câu trả lời đã được đưa ra.
Archemar


0
#!/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

3
1) không cần thiết 2> /dev/null, 2) không thêm bất cứ điều gì vào câu trả lời hiện có.
xenoid
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.