Cách gọi hàm bash


28

Có lẽ tôi đang nhìn sai cách này .. Nhưng đây là những gì tôi đang cố gắng làm. Thực hiện hầu hết công việc của tôi với Java nhưng chỉ chuyển sang môi trường unix (bash). Tôi đang làm việc này:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Nhưng tôi có hai chức năng trong tập tin của mình và tôi muốn có thể gọi chúng riêng biệt với dòng lệnh. Tức là: myFunc.ls2()hoặc thậm chí chỉ ls2. Tôi biết rằng tôi có thể thêm các chức năng vào .bashrctệp của mình nhưng có cách nào khác để tôi có thể thực hiện các chức năng này mà không cần thêm chúng vào .bashrckhông?

Câu trả lời:


25

Một cách để làm điều này, liên quan đến việc gõ nhiều hơn một chút, là thông qua sourcelệnh. Để gọi một hàm từ myFunc, bạn có thể sử dụng source myFunc; ls2và nó sẽ xuất ra Hello World.

Vì vậy, ví dụ, tôi có một tệp gọi là say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

bây giờ tôi muốn gọi talk()chức năng của nó từ dòng lệnh:

[john @ awesome ~] $ nguồn say.sh; nói chuyện
Chào!

để gọi nó từ một tập lệnh bash khác:

#!/bin/bash
source say.sh
talk

Bạn cũng có thể đặt từng tập lệnh riêng biệt và thêm chúng vào một thư mục nằm trong biến PATH của bạn.

vì vậy, ví dụ, trong một tập lệnh được gọi là hellobạn có:

#!/bin/bash
echo "Hello World"

bây giờ đặt nó vào một trong các thư mục trong PATH của bạn, mà bạn có thể xem bằng cách chạy echo $PATH. Bạn có thể thêm một thư mục khác vào PATH của mình nếu bạn muốn hoặc sử dụng một thư mục hiện có. Khi bạn đã sao chép tệp ở đó, hãy thực hiện nó với chmod +x filename.


3
Nói rõ hơn: bạn chỉ phải lấy nguồn một lần cho mỗi tập lệnh hoặc khởi động shell. Bạn có thể gọi hàm nhiều lần như bạn muốn sau đó mà không cần tham khảo tệp có nguồn gốc nữa.
Tạm dừng cho đến khi có thông báo mới.

5

Một cách tiếp cận khác là tạo một tập lệnh được gọi functions.sh( ~/binví dụ trong thư mục).

Trong tập lệnh này, bạn thêm tất cả các định nghĩa chức năng cá nhân của mình (giả sử mỗi khi bạn thêm chức năng bạn thêm nó vào tệp này ...)

Cuối cùng, bạn chỉ cần thêm source ~/bin/functions.shdòng vào .bashrctập tin của bạn . Bằng cách này, bạn sẽ có thể gọi cho họ từ dòng lệnh, bạn .bashrcsẽ giữ sạch sẽ và bạn sẽ có một vị trí cụ thể cho các chức năng cá nhân của bạn.


5

Nếu bạn giống như tôi, bạn không muốn làm lộn xộn môi trường của mình với các chức năng. Bạn cũng có một nhóm các chức năng thuộc về nhau về những gì chúng làm, vì vậy việc đặt chúng vào cùng một tệp tập lệnh có ý nghĩa. (Tôi biết rằng một thư mục có nhiều tệp có thể phục vụ cùng một mục đích). Đây là một giải pháp khả thi cho phép bạn gọi một chức năng cụ thể trong tập lệnh:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

Tôi thích điều này hơn rất nhiều sourcevì nó có thể xử lý có hai chức năng cùng tên trong hai tệp sh khác nhau. Tôi đã tinh chỉnh nó để xử lý một số lượng tham số tùy ý bằng cách thay thế $1 $2 $3 $4 $5bằngFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: Tại sao phải nhảy qua vòng? Chỉ cần thay đổi dòng cuối cùng để "$@". PS Cách tiếp cận của bạn thực sự sai; phần cuối cùng phải là "$FUNC_CALL" "$@"  (nghĩa là  $FUNC_CALLnên có trong ngoặc kép).
Scott

"$FUNC_CALL"
ctrl-alt-delor

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.