Почему "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
Итак, вот вопрос - для чего я должен (если должен...) вставить declare
здесь?
С ним - или без него он работает так же...
Я могу понять, например, declare -i var
или declare -r var
. Но для чего -f
(объявить функцию) и -a
(объявить массив)?
Спасибо за советы и ссылки.
Ответы
Ответ 1
declare -f functionname
используется для вывода определения функции functionname
, если он существует, и абсолютно не объявлять, что functionname
является/будет функцией. Посмотрите:
$ 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.
Ответ 2
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 "$1" >/dev/null && echo 0 || echo 1
}
isDefined f
isDefined g
[ ~]$ ./test.sh
0
1
[ ~]$ declare -f
existFunction ()
{
declare -f "$1" > /dev/null && echo 0 || echo 1
}
f ()
{
echo "Hello world"
}
Однако так, как сказано ниже, gniourf_gniourf: лучше использовать declare -f
для проверки существования функции.
Ответ 3
Насколько я знаю, только один параметр -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