2015-06-09 6 views
3

Я хочу запустить некоторую команду, назовем ее «test» из моего сценария bash и поместим туда некоторые из параметров из переменной bash.Bash quotes disable escaping

Мой сценарий:

#!/bin/bash -x 
PARAMS="-A 'Foo' -B 'Bar'" 
./test $PARAMS 

У меня есть:

+ PARAMS='-A '\''Foo'\'' -B '\''Bar'\''' 
+ ./test -A ''\''Foo'\''' -B ''\''Bar'\''' 

Это неправильно!

Еще один случай:

#!/bin/bash -x 
PARAMS='-A '"'"'Foo'"'"' -B '"'"'Bar'"'" 
./test $PARAMS 

Результата Грустно тоже:

+ PARAMS='-A '\''Foo'\'' -B '\''Bar'\''' 
+ ./test -A ''\''Foo'\''' -B ''\''Bar'\''' 

Итак, вопрос - как я могу использовать Баш переменного в качестве аргументов командной строки для некоторой команды. Переменная - это что-то вроде «-A 'Foo' -B 'Bar'" (точно с одиночными кавычками) И результат должен быть вызовом программы «./test» с аргументами «-A 'Foo' -B 'Bar' "следующим образом:

./test -A 'Foo' -B 'Bar' 

Спасибо!

+0

Возможно, я должен добавить некоторый параметр в #!/Bin/bash, например «-x», который я добавил, чтобы увидеть необработанные команды. –

+0

Если вы просто эхо ваш первый, он находится в правильном формате. '-x' просто показывает, как bash видит это не ваш скрипт. – 123

ответ

8

Это безопаснее использовать BASH массивы для хранения полных или частичных командных строк, как это:

params=(-A 'Foo' -B 'Bar') 

затем называют его:

./test "${params[@]}" 

, который будет так же, как:

./test -A 'Foo' -B 'Bar' 
+1

Ницца! TY очень много. Помогает! –

+0

Рад узнать, что это сработало, вы можете отметить ответ как принятый, щелкнув по метке в левом верхнем углу моего ответа. – anubhava

+3

@IvanPomortsev Это не только безопаснее, но и именно поэтому массивы существуют в оболочках. – chepner