【问题标题】:Nullglob breaks array declaration printingNullglob 中断数组声明打印
【发布时间】:2017-02-16 23:15:31
【问题描述】:

在 GNU bash 版本 3.2.57 上,我发现使用 declare 打印数组变量和 nullglob 选项之间存在冲突。

这两个在我看来是非常不相关的,但这是在启用nullglob 时故意的吗?

#!/bin/bash

test () {
  local FOO="xyz"
  local BAR=("one" "two" "three")
  declare -p FOO
  declare -a -p BAR
}

echo $(test)
shopt -s nullglob
echo $(test)
shopt -u nullglob
echo $(test)

输出:

declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'
declare -- FOO="xyz" declare -a
declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'

注意中间行,当设置nullglob 时,不会发出BAR 的声明。

【问题讨论】:

    标签: arrays bash glob shopt


    【解决方案1】:

    问题不是nullglob 而是没有引用echo 命令。

    如果你引用它,那么它应该可以正常工作:

    shopt -s nullglob
    echo "$(test)"
    declare -- FOO="xyz"
    declare -a BAR='([0]="one" [1]="two" [2]="three")'
    

    不带引号的 shell 正在尝试扩展 test 函数的输出,因为输出中有许多 glob 字符。

    如果设置了nullglob,则扩展失败,并且不会为失败的 glob 表达式打印任何内容。

    【讨论】:

    • 啊,有趣。我没有意识到我需要引用$()。如果允许,我会在几分钟内接受你的回答。谢谢!
    【解决方案2】:

    如果不引用echo $(test),那么$(test) 部分会受到路径名扩展的影响。 declare -p 的结果包含 [] 字符,这些字符根据文件系统进行检查。如果设置了 nullglob 并且没有匹配的文件,则删除该单词。

    尝试设置shopt -s failglob 以更详细地查看正在发生的事情;缺少匹配的文件会导致错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多