这是测试参数是否已声明的正确方法吗?

这是测试参数是否已声明的正确方法吗?

这是一个例子https://unix.stackexchange.com/a/56846/674

测试是否已声明任何类型的变量的另一种特定于 bash 的方法是检查它是否在中列出${!PREFIX*}

case " ${!foobar*} " in
  *" foobar "*) echo "foobar is declared";;
  *) echo "foobar is not declared";;
esac
  1. 如果我是正确的,为了使参数未声明,我们使用unset内置的。这个unset案例就像引文所说的那样,

    $ unset foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    declared 情况没有:

    $ unset foobar
    $ declare foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    这是测试参数是否已声明的正确方法吗?

  2. 另外" ${!foobar*} ",为什么参数扩展前后有空格?当foobar它是数组或字典以及它是变量但不是数组或字典时它是否有效?

答案1

  1. 看起来你必须用一个值声明变量(可以为空):

    unset foobar; declare foobar=
    

    case 语句将生成“foobar 已声明”。

  2. 您使用引号和空格,以便*" foobar "*可以检测到特定的变量名称列表返回的变量名数量${!foobar*}

    $ unset foobar; foobarbaz=1; foobarquz=2
    $ echo " ${!foobar*} "
     foobarbaz foobarquz 
    

    case 语句将生成“foobar 未声明”。

相关内容