Почему" declare-f "и" declare-a " необходимы в сценариях bash?

извините за такой невинный вопрос - я просто пытаюсь понять...

например - я:

$ cat test.sh
#!/bin/bash
declare -f testfunct

testfunct () {
echo "I'm function"
}

testfunct

declare -a testarr

testarr=([1]=arr1 [2]=arr2 [3]=arr3)

echo ${testarr[@]}

и когда я запускаю его, я получаю:

$ ./test.sh
I'm function
arr1 arr2 arr3

так вот вопрос - для чего я должен (если должен...) insert declare здесь? С ним или без него работает так же...

Я могу понять, например declare -i var или declare -r var. Но для чего?!--5--> (объявить функцию) и -a (объявить массив)?

Спасибо за советы и связи.

3 ответов


declare -f functionname используется для вывода определения функции functionname, если он существует, и абсолютно не объявить это functionname is / будет функцией. Смотри:

$ unset -f a # unsetting the function a, if it existed
$ declare -f a
$ # nothing output and look at the exit code:
$ echo $?
1
$ # that was an "error" because the function didn't exist
$ a() { echo 'Hello, world!'; }
$ declare -f a
a () 
{ 
    echo 'Hello, world!'
}
$ # ok? and look at the exit code:
$ echo $?
0
$ # cool :)

так что в вашем случае declare -f testfunct ничего не будет делать, кроме, возможно, если testfunct существует, он выведет свое определение на stdout.


насколько я знаю, опция-a сама по себе не имеет практической значимости, но я думаю, что это плюс для читаемости при объявлении массивов. Это становится более интересным, когда он в сочетании с другими опциями генерирует массивы специального типа.

например:

# Declare an array of integers
declare -ai int_array

int_array=(1 2 3)

# Setting a string as array value fails
int_array[0]="I am a string"

# Convert array values to lower case (or upper case with -u)
declare -al lowercase_array

lowercase_array[0]="I AM A STRING"
lowercase_array[1]="ANOTHER STRING"

echo "${lowercase_array[0]}"
echo "${lowercase_array[1]}"

# Make a read only array
declare -ar readonly_array=(42 "A String")

# Setting a new value fails
readonly_array[0]=23

declare -f позволяет перечислить все определенные функции (или источники) и их содержимое.

пример использования:

[ ~]$ cat test.sh
#!/bin/bash

f(){
    echo "Hello world"
}

# print 0 if is defined (success)
# print 1 if isn't defined (failure)
isDefined(){
    declare -f "" >/dev/null && echo 0 || echo 1
}

isDefined f
isDefined g
[ ~]$ ./test.sh 
0
1
[ ~]$ declare -f
existFunction () 
{ 
    declare -f "" > /dev/null && echo 0 || echo 1
}
f () 
{ 
    echo "Hello world"
}

однако, как Бойко сказал gniourf_gniourf ниже: лучше использовать declare -F для проверки существования функции.