GNU/Linux >> Belajar Linux >  >> Linux

Dapatkan daftar nama fungsi dalam skrip shell

typeset -f mengembalikan fungsi dengan badannya, jadi skrip awk sederhana digunakan untuk mencabut nama fungsi

f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
    echo "functions available:"
    typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main

Skrip ini menghasilkan:

functions available:
f1
f2
f3
f4
help

Anda memanggil fungsi ini tanpa argumen dan hanya mengeluarkan daftar nama fungsi yang dipisahkan "spasi putih".

function script.functions () {
    local fncs=`declare -F -p | cut -d " " -f 3`; # Get function list
    echo $fncs; # not quoted here to create shell "argument list" of funcs.
}

Untuk memuat fungsi ke dalam larik:

declare MyVar=($(script.functions));

Tentu saja, akal sehat mengatakan bahwa fungsi apa pun yang belum dimasukkan ke dalam file saat ini sebelum pemanggilan ini tidak akan muncul dalam daftar.

Untuk Membuat daftar hanya-baca dan tersedia untuk diekspor ke skrip lain yang dipanggil oleh skrip ini:

declare -rx MyVar=($(script.functions));

Untuk mencetak seluruh daftar sebagai baris baru yang dipisahkan:

printf "%s\n" "${MyVar[@]}";

Anda bisa mendapatkan daftar fungsi dalam skrip Anda dengan menggunakan perintah grep pada skrip Anda sendiri. Agar pendekatan ini berhasil, Anda perlu menyusun fungsi Anda dengan cara tertentu sehingga grep dapat menemukannya. Ini contohnya:

$ cat my.sh
#!/bin/sh

function func1() # Short description
{
    echo func1 parameters: $1 $2
}

function func2() # Short description
{
    echo func2 parameters: $1 $2
}

function help() # Show a list of functions
{
    grep "^function" $0
}

if [ "_$1" = "_" ]; then
    help
else
    "[email protected]"
fi

Ini adalah demo interaktif:

$ my.sh 
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh help
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh func1 a b
func1 parameters: a b

$ my.sh func2 x y
func2 parameters: x y

Jika Anda memiliki fungsi "pribadi" yang tidak ingin Anda tampilkan di bantuan, hilangkan bagian "fungsi":

my_private_function()
{
    # Do something
}

Hal terbaik untuk dilakukan adalah membuat larik (Anda menggunakan bash) yang berisi fungsi yang ingin Anda iklankan dan membuat fungsi bantuan Anda mengulang dan mencetaknya.

Memanggil set sendiri akan menghasilkan fungsi, tetapi secara keseluruhan. Anda masih harus mengurai mencari hal-hal yang diakhiri dengan () untuk mendapatkan simbol pepatah .

Mungkin juga lebih waras untuk menggunakan sesuatu seperti getopt untuk mengubah --function-name ke dalam function_name dengan argumen. Tapi, waras itu relatif dan Anda belum memposting kode :)

Pilihan Anda yang lain adalah membuat bash yang dapat dimuat (garpu dari set ) yang menyelesaikan ini. Sejujurnya, saya lebih suka menggunakan penguraian sebelum menulis yang dapat dimuat untuk tugas ini.


Linux
  1. Bagaimana Cara Mendapatkan Alamat Ip Eksternal Dalam Script Shell?

  2. Waktu Habis Dalam Skrip Shell?

  3. Bagaimana Cara Mendapatkan Alamat Ip Sendiri Dan Menyimpannya Ke Variabel Dalam Script Shell?

  1. Script Shell Dengan Fungsi Dan Parameter Sebagai Variabel?

  2. Fungsi Dalam Variabel Shell?

  3. Skrip shell Linux untuk menambahkan angka nol di depan nama file

  1. Direktori skrip Shell saat ini?

  2. Cara mendapatkan PID dari proses anak bercabang di skrip Shell

  3. Dapatkan baris tertentu dari file teks hanya dengan menggunakan skrip shell