22

对不起这个无辜的问题 - 我只是想理解......

例如 - 我有:

$ 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 vardeclare -r var。但是-f(声明函数)和-a(声明数组)是什么?

4

3 回答 3

16

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,它将在标准输出上输出其定义。

于 2013-11-02T13:21:15.723 回答
7

据我所知,单独的 -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
于 2013-11-02T14:18:55.933 回答
5

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来测试一个函数的存在。

于 2013-11-02T13:20:56.067 回答