【问题标题】:Why are "declare -f" and "declare -a" needed in bash scripts?为什么 bash 脚本中需要“declare -f”和“declare -a”?
【发布时间】:2013-11-13 13:22:04
【问题描述】:

抱歉这个无辜的问题 - 我只是想理解......

例如 - 我有:

$ 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(声明数组)是为了什么?

【问题讨论】:

  • declare 最常见的用法是在函数内部,当没有给定标志时,它的行为与local 相同。某些数据类型也可能需要它,即。 declare -A 用于关联数组。 declare -g 通常是一个有用的功能,当您希望完全明确地向读者表明您有意引用函数内部的全局,而不是忘记声明它并隐式将其设为全局.

标签: bash function declare


【解决方案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 存在,它会在标准输出上输出它的定义。

【讨论】:

    【解决方案2】:

    据我所知,单独的 -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
    

    【讨论】:

    • 显然 -l-u 只是 bash 4+。
    【解决方案3】:

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

    【讨论】:

    • 要检查一个函数是否存在,最好使用declare -F
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2015-01-16
    • 2011-03-31
    • 1970-01-01
    • 2013-11-05
    • 2017-06-04
    相关资源
    最近更新 更多