ARX*_*ARX 6 bash parameter null
我需要将参数扩展作为程序参数传递。扩展导致文件名带有空格。因此,我用双引号将文件名作为一个单词:"$var"
.
只要$var
包含文件名,程序就会得到一个单字参数并且它工作正常。但是,有时扩展会导致空字符串,当作为参数传递时,会破坏程序(我无法更改)。
根据 Bash 参考手册,不删除空字符串是指定的行为:
如果没有值的参数在双引号内展开,则结果为空参数并保留。
但是,我如何管理需要引用变量但也需要丢弃空字符串扩展的情况?
编辑:
感谢 George Vasiliou,我发现我的问题中缺少一个细节(只是尽量保持简短:))。运行程序是一个很长的java调用,缩写如下:
java -cp /etc/etc MyClass param1 param2 "$var" param4
Run Code Online (Sandbox Code Playgroud)
事实上,使用if
乔治所描述的语句就可以解决问题。但是它需要一个在then
子句中带有“$var”的调用,另一个在子句中没有“$var” else
。
为了避免重复,我想看看是否有一种方法可以使用单个调用来丢弃“$var”为空时的扩展。
该${parameter:+word}
参数扩展形式,似乎做的工作
( xyz=2; set -- ${xyz:+"$xyz"}; echo $# )
1
( xyz=; set -- ${xyz:+"$xyz"}; echo $# )
0
( unset xyz; set -- ${xyz:+"$xyz"}; echo $# )
0
Run Code Online (Sandbox Code Playgroud)
所以这应该转化为
program ${var:+"$var"}
Run Code Online (Sandbox Code Playgroud)
在你的情况下
在bash
具有类似数组支持的外壳中,您可以执行以下操作:
# default is an empty array
param=()
# if $var is not empty then add it to array
[[ "$var" ]] && param=("$var")
# use the $@-like magic for arrays
java -cp /etc/etc MyClass param1 param2 "${param[@]}" param4
Run Code Online (Sandbox Code Playgroud)
demo() {
[[ "$var" ]] && param=("$var") || param=()
echo -n 'output: '
printf '<%s> ' before "${param[@]}" after
echo
}
demo # output: <before> <after>
var=''
demo # output: <before> <after>
var='foo bar'
demo # output: <before> <foo bar> <after>
Run Code Online (Sandbox Code Playgroud)
另请参阅https://github.com/koalaman/shellcheck/wiki/SC2086#exceptions,其中还再次解释了iruvar答案中的方法。
归档时间: |
|
查看次数: |
1965 次 |
最近记录: |