相关疑难解决方法(0)

为什么在bash中将空数组视为未设置?

最近,我在计算机上设置了Microsoft的Windows Linux子系统。它只是模仿Linux环境和东西。基本上是Cygwin,但与底层Windows系统的连接要好一些。从Cygwin切换到WSL之后,我遇到了一个问题。我不知道它是否特定于Windows的实现,但这在Cygwin中不会发生。

为了更快地捕获代码中的错误,我开始使用bash的set -u选项,该选项使外壳“在替换时将未设置的变量视为错误”。否则,bash在扩展它们时会将未设置的变量视为设置为空字符串的变量。

但是,这对数组有一个奇怪的意外结果(至少在WSL上):

Me@Computer:~$ set -u
==>
Me@Computer:~$ declare -p array
==> bash: declare: array: not found
Me@Computer:~$ array=( )
==>
Me@Computer:~$ declare -p array
==> declare -a array='()'
Me@Computer:~$ echo "${array[@]}"       # Expands to "echo" (with 0 args), right?
==> bash: array[@]: unbound variable    # Wrong! wtf, bash??
Run Code Online (Sandbox Code Playgroud)

从的输出中可以看到declare -p array,bash 确实识别出数组为空和数组未设置之间的区别-直到需要真正对其进行扩展时,bash才适合。我知道bash 特别对待@and *变量,甚至在引用时也是如此,因此我尝试了很多东西。无效:

Me@Computer:~$ echo "${array[@]}"
==> bash: array[@]: unbound variable
Me@Computer:~$ echo "${array[*]}"
==> bash: …
Run Code Online (Sandbox Code Playgroud)

arrays bash shell windows-subsystem-for-linux

8
推荐指数
1
解决办法
569
查看次数

标签 统计

arrays ×1

bash ×1

shell ×1

windows-subsystem-for-linux ×1