Bash: как хранить несколько параметров в строке? - PullRequest
0 голосов
/ 23 июня 2018

В скрипте 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 голосов
/ 23 июня 2018

Я предлагаю использовать массивы, которыми вы можете легко манипулировать и даже использовать некоторые подстановки при расширении.

Также обратите внимание, что -c эквивалентно началу команды непосредственно с +.

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

Последняя строка автоматически добавляет + к каждому аргументу.

0 голосов
/ 23 июня 2018

См. Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!

Использовать массив

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