如何在不防止空字符串删除的情况下防止分词?

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”为空时的扩展。

iru*_*var 7

${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)

在你的情况下


phk*_*phk 5

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答案中的方法。