Bash:如何在一个字符串中存储多个选项?

时间:2018-06-23 14:51:18

标签: bash vim quoting

在bash脚本中,我启动带有选项的 Vim

vim "-c startinsert" "+normal 2G4|" foo  

需要双引号,但是可以用简单的双引号代替:

vim '-c startinsert' '+normal 2G4|' foo  

由于这些选项可能因一个文件而异,我想将它们存储在字符串中,通常是:

opt='"-c startinsert" "+normal 2G4|"'  

然后:

vim $opt foo  

但是那行不通,我尝试使用引号,双引号,转义等所有组合...

实际上,我发现它起作用的唯一方法是每个字符串仅存储一个选项:

o1="-c startinsert"  
o2="+normal 2G4|"  
vim "$o1" "$o2" foo

那么,是否可以在字符串中存储两个(或多个)选项?因为当我尝试时, bash 似乎将它们解释为文件名,例如:

opt='"-c startinsert" "+normal 2G4|"'  
vim "$opt" foo  

Vim 将打开两个文件:

  1. ""-c startinsert" "+normal 2G4|""
  2. foo

而不是使用选项foo打开"-c startinsert" "+normal 2G4|"

2 个答案:

答案 0 :(得分:2)

请参见I'm trying to put a command in a variable, but the complex cases always fail!

使用数组

opts=(
    -c "startinsert" 
    "+normal 2G4|"
)  
vim "${opts[@]}" foo  

答案 1 :(得分:0)

我建议使用数组,您可以轻松地操作它,甚至在扩展时甚至可以使用一些替换。

还要注意,-c等效于直接以+开始命令。

opt=(startinsert 'normal 2G4|')
# opt+=('normal l')
vim "${opt[@]/#/+}" foo

最后一行自动在每个参数前加上+