Если у меня есть файл:
dome.sh

$ls -l dome.sh
-rwxrwxr-x 1 user user 0 Aug  8 11:19 dome.sh

и содержимое файла похоже на:

#!/bin/bash
function() {
    'work'
    }
another() {
    'different work'
    }
...
#30 functions later
yetANOTHERfunction () {
    'even more work'
    }

где «# 30 функций позже» означает, что есть 30 уникальных дополнительных функций

Можно ли как-то пройти через все функции в этом скрипте, чтобы идентифицировать их?

что-то вроде:

for i in $(get all functions in this file); do
    echo $i
done

производить:

function
another
...
yetANOTHERfunction

2 ответа2

1

Если вы используете заглавную букву "F" в «Declare -F», он будет возвращать строки, такие как «Declare -F functionName» Теперь все, что вам нужно сделать, это обрезать первую часть этой строки. Вот код:

#!/bin/bash
function () {
   return
}
another () {
   return
}
yetANOTHERfunction () {
   return
}
IFS=$'\n'
for f in $(declare -F); do
   echo "${f:11}"
done
0

Пытаться:

get_fcn_list () {
    env -i bash --noprofile --norc -c '
    source "'"$1"'"
    typeset -f |
    grep '\''^[^{} ].* () $'\'' |
    awk "{print \$1}" |
    while read -r fcn_name; do
        type "$fcn_name" | head -n 1 | grep -q "is a function$" || continue
        echo "$fcn_name"
    done
'
}

for fcn_name in $(get_fcn_list dome.sh); do
    echo "$fcn_name"
done

Объяснение:

  • Вместо того, чтобы анализировать функции самостоятельно, позвольте bash проанализировать их (с source) и вывести содержимое (typeset -f).

  • Вызов env -i bash --noprofile --norc предназначен для предотвращения чтения bash любых файлов инициализации. В противном случае вы можете получить функции, определенные, например, в ~/.bashrc .

  • typeset -f выведет все функции и их определения. Каждое определение начинается с: имя функции, пробел, () , пробел, перевод строки . grep и awk извлекают имена функций из этих строк.

  • Причина фильтра в том, что вы можете получить ложные срабатывания, когда у вас есть такие функции, как:

    f () 
    { 
        echo "
    a () 
    "
    }
    

    Здесь цикл в while бы ошибочно печатать, но фильтр заботится об этом.

  • Отредактировано для печати функций из файла и избегать включения файлов запуска.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .