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

Bash: how to store multiple options in a string?

在 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

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

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

使用数组

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

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

此外,请注意 -c 相当于直接使用 + 开始命令。

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

最后一行自动为每个参数添加 +