2016-02-05 88 views
2

我写了一个函数,在我的~/.bashrc文件中清除注释的配置文件。功能如下:Bash丢失']'错误输出

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

基本上,如果用户没有通过第二个参数,使用#作为注释符,寻找和清洁它指出。第一个参数只是文件本身。功能“作品”但是当我;运行它作为清洁的性格,我得到如下:

[[email protected]]: /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根本无法加载。

任何想法?下面的版本信息:

[[email protected]]: ~ # bash --version | head -n1 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
+1

choroba的答案是正确的,但请注意,您可以通过使用'CLEANCHAR = $ {2 - #}'来简化代码。还要注意,如果指定一个正则表达式元字符CLEANCHAR,该函数将无法正常工作。 – pjh

回答

3

收盘]前的空间是不可选:

[ -z "$2" ] 
#  ^

没有它,命令是OK,只有当$2是空的,所以它成为[ -z ]

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

[[ -z $2 ]] 
+0

@ScottCrooks:他们不一样。 '[''不需要引用,支持逻辑运算符'&&'和'||',但在其他shell类型中不受支持。 – choroba

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未设置或为空,请使用“默认”值