【问题标题】:Bash missing ']' error for outputBash 缺少 ']' 输出错误
【发布时间】:2016-02-05 19:37:00
【问题描述】:

我在 ~/.bashrc 文件中编写了一个函数来清理 cmets 的配置文件。函数如下:

clean_config()
{
    [ -z "$2"] && CLEANCHAR="#" || CLEANCHAR="$2"
    egrep -v "^[[:space:]]*${CLEANCHAR}|^$" "$1" | uniq
}

基本上它说明如果用户没有传递第二个参数,则使用# 作为注释字符来查找和清理。第一个参数只是文件本身。该功能“有效”,但是当我使用 ; 作为要清理的字符运行它时,我得到以下信息:

[root@server]: /etc/php5/fpm/pool.d # clean_config www.conf \;
bash: [: missing `]'
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data

它很好地转义了字符,但我总是在顶部看到 bash: [: missing ']' 行。我尝试将其更改为 [[ -z "$2"]] 但这会导致 bash.bashrc 根本无法加载。

有什么想法吗?版本信息如下:

[root@server]: ~ # bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

【问题讨论】:

  • choroba 的回答是正确的,但请注意,您可以使用CLEANCHAR=${2-#} 来简化代码。另请注意,如果您指定的 CLEANCHAR 是正则表达式元字符,该函数将无法正常工作。

标签: bash escaping .bash-profile


【解决方案1】:

结束]之前的空格不是可选的:

[ -z "$2" ]
#        ^

没有它,只有$2为空时命令才OK,所以变成[ -z ]

同样适用于[[ ... ]],但你不必引用里面的变量:

[[ -z $2 ]]

【讨论】:

  • @ScottCrooks:它们是不同的。 [[ 不需要引号,支持逻辑运算符&&||,但在其他shell 类型中不支持。
【解决方案2】:

bash parameter expansions提供这种“默认值”赋值:

$ set -- x "second arg"
$ CLEANCHAR=${2:-#}
$ echo "$CLEANCHAR"
second arg

$ set -- x
$ CLEANCHAR=${2:-#}
$ echo "$CLEANCHAR"
#

$ set -- x ""
$ CLEANCHAR=${2:-#}
$ echo "$CLEANCHAR"
#

${x:-default} 表示:如果$x 未设置或为空,则使用“默认”值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 2019-11-28
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多