Cara memanggil fungsi bash


28

Mungkin saya melihat ini dengan cara yang salah .. Tapi di sini saya mencoba melakukan apa. Melakukan sebagian besar pekerjaan saya dengan Java tetapi hanya beralih ke lingkungan unix (bash). Saya melakukan ini:

[~/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

Tetapi saya memiliki dua fungsi dalam file saya dan saya ingin dapat memanggil mereka secara terpisah dari baris perintah. Yaitu: myFunc.ls2()atau bahkan adil ls2. Saya tahu bahwa saya dapat menambahkan fungsi ke .bashrcfile saya, tetapi adakah cara lain untuk menjalankan fungsi ini tanpa menambahkannya ke saya .bashrc?

Jawaban:


25

Salah satu cara untuk melakukan ini, yang melibatkan pengetikan lebih sedikit, adalah melalui sourceperintah. Untuk memanggil fungsi dari myFunc Anda bisa menggunakan source myFunc; ls2dan itu akan menampilkan Hello World.

Jadi misalnya, saya punya file bernama say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

sekarang saya ingin memanggil talk()fungsinya dari baris perintah:

[john @ awesome ~] $ source say.sh; berbicara
Hai!

untuk memanggilnya dari skrip bash lain:

#!/bin/bash
source say.sh
talk

Anda juga dapat menempatkan masing-masing dalam skrip terpisah dan menambahkannya dalam direktori yang ada dalam variabel PATH Anda.

jadi misalnya, dalam satu skrip bernama helloAnda akan memiliki:

#!/bin/bash
echo "Hello World"

sekarang letakkan di salah satu direktori di PATH Anda, yang dapat Anda lihat dengan menjalankan echo $PATH. Anda dapat menambahkan direktori lain ke PATH Anda jika Anda ingin atau menggunakan yang sudah ada. Setelah Anda menyalin file di sana, buat itu dapat dieksekusi chmod +x filename.


3
Untuk lebih jelasnya: Anda hanya perlu sumber file sekali per skrip atau shell startup. Anda dapat memanggil fungsi sebanyak yang Anda inginkan setelah itu tanpa merujuk file sumber lagi.
Dijeda sampai pemberitahuan lebih lanjut.

5

Pendekatan lain adalah dengan membuat skrip yang disebut functions.sh(dalam ~/bindirektori misalnya).

Dalam skrip ini, Anda menambahkan semua definisi fungsi pribadi Anda (katakanlah setiap kali Anda menambahkan fungsi, Anda menambahkannya ke file ini ...)

Akhirnya Anda hanya perlu menambahkan source ~/bin/functions.shbaris ke .bashrcfile Anda . Dengan cara ini Anda akan dapat memanggil mereka dari baris perintah, Anda .bashrcakan tetap bersih, dan Anda akan memiliki tempat khusus untuk fungsi pribadi Anda.


5

Jika Anda seperti saya, Anda tidak ingin mengacaukan lingkungan Anda dengan fungsi. Anda juga memiliki sekelompok fungsi yang dimiliki bersama dalam hal apa yang mereka lakukan, jadi menempatkannya dalam file skrip yang sama masuk akal. (Saya tahu bahwa folder dengan banyak file dapat melayani tujuan yang sama). Berikut ini adalah solusi yang memungkinkan Anda untuk memanggil fungsi tertentu dalam skrip:

$ 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    
$

Saya lebih menyukai ini daripada sourcekarena dapat menangani memiliki dua fungsi dengan nama yang sama dalam dua file sh yang berbeda. Saya memperbaikinya untuk menangani sejumlah parameter sewenang-wenang dengan menggantinya $1 $2 $3 $4 $5denganFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ ChuckWilbur: Mengapa melompat melalui lingkaran? Ubah saja baris terakhir menjadi "$@". PS Pendekatan Anda sebenarnya salah; bagian terakhir harus "$FUNC_CALL" "$@"  (yaitu,  $FUNC_CALLharus dalam tanda kutip).
Scott

Apa "$FUNC_CALL"?
ctrl-alt-delor

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.