Làm thế nào để truyền tham số cho chức năng trong một tập lệnh bash?


14

Tôi muốn viết một hàm mà tôi có thể gọi từ một tập lệnh với nhiều biến khác nhau. Vì một số lý do tôi gặp nhiều rắc rối khi làm việc này. Các ví dụ tôi đã đọc luôn chỉ sử dụng một biến toàn cục nhưng điều đó sẽ không làm cho mã của tôi dễ đọc hơn nhiều như tôi có thể thấy.

Ví dụ sử dụng dự định:

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
result=$para1 + $para2
}

add $var1 $var2
add $var3 $var4
# end of the script

./myscript.sh 1 2 3 4

Tôi đã thử sử dụng $1và như vậy trong hàm, nhưng sau đó nó chỉ lấy toàn cục mà toàn bộ tập lệnh được gọi từ. Về cơ bản những gì tôi đang tìm kiếm là một cái gì đó như thế $1, $2v.v. nhưng trong bối cảnh cục bộ của một chức năng. Giống như bạn biết, các chức năng hoạt động trong bất kỳ ngôn ngữ thích hợp.


Sử dụng $ 1 và $ 2 trong ví dụ của bạn, thêm chức năng "hoạt động". Hãy thử echo $1echo $2trong đó.
Wieland

Ví dụ của tôi là không đầy đủ khủng khiếp, tôi đã cập nhật nó một loạt. Bây giờ afaik nó sẽ không hoạt động nữa.
dùng181822

Thay thế result = bằng result=$(($1 + $2))và thêm echo $resultsau khi nó hoạt động chính xác, $ 1 và $ 2 là các đối số chức năng của bạn.
Wieland

Câu trả lời:


18

Để gọi một hàm với các đối số:

function_name "$arg1" "$arg2"

Hàm tham chiếu đến các đối số được truyền theo vị trí của chúng (không phải theo tên), đó là $ 1, $ 2, v.v. $ 0 là tên của chính tập lệnh.

Thí dụ:

#!/bin/bash

add() {
    result=$(($1 + $2))
    echo "Result is: $result"
}

add 1 2

Đầu ra

./script.sh
 Result is: 3

2
Tôi nhận ra sai lầm của mình bây giờ. Tôi đã sử dụng $ 0 và $ 1 trong hàm và $ 0 thực sự được phân giải thành tên tập lệnh. Tôi nhầm nó với một tham số của tập lệnh chứ không phải chính chức năng. Cảm ơn bạn!
dùng181822

6

Trong tập lệnh chính $ 1, $ 2, đại diện cho các biến như bạn đã biết. Trong các chỉ mục hoặc hàm, $ 1 và $ 2 sẽ đại diện cho các tham số, được truyền cho các hàm, dưới dạng các biến nội bộ (cục bộ) cho các đăng ký này.

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
  #Note the $1 and $2 variables here are not the same of the
  #main script... 
  echo "The first argument to this function is $1"
  echo "The second argument to this function is $2"
  result=$(($1+$2))
  echo $result

}

add $var1 $var2
add $var3 $var4
# end of the script


./myscript.sh 1 2 3 4
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.