2014-08-28 5 views
1

У меня есть скрипт с ниже 2 команды:Как я могу исправить sed invalid command code '?

sedcmd1="sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' /Users/abc/data.xml" 
$sedcmd1 

когда я запускаю сценарий, я получаю ниже ошибки:

sed: 1: "'/<PromptOnUpdate ...": invalid command code ' 

Если я выполнить команду без присвоения его переменной, она работает просто хорошо. Но я получаю сообщение об ошибке только тогда, когда я назначаю его переменной, выполнив ее оттуда.

Мне нужна команда в переменной для моих нужд, так как я пытаюсь получить команду в качестве аргумента для сценария оболочки.

Отрывок из data.xml:

<?xml version="1.0" ?> 
<Settings Version="1.0.0"> 
    <Android> 
     <PromptOnUpdate>true</PromptOnUpdate> 
    </Android> 
</Settings> 

Спасибо за глядя на это!

PS: Я на Mac OSX Mavericks

ответ

4

Котировки не обрабатываются после расширения переменной. Вы должны использовать eval:

eval "$sedcmd1" 
+2

Или еще лучше, [не делать] (http://mywiki.wooledge.org/BashFAQ/050). – tripleee

+0

Работает как шарм. Большое спасибо! – user1819441

+0

Обратите внимание, что метод массива в ответе @ John1024 обычно считается лучшим решением. Если у вас есть вложенные кавычки в команде, им сложнее использовать 'eval'. – Barmar

1

Оболочка обрабатывает кавычки, прежде чем она расширяется переменные. Это означает, что кавычки внутри вашей переменной не имеют магии; они обрабатываются так же, как и любой другой символ.

Чтобы сохранить сложную команду в качестве переменной, нужен массив:

sedcmd1=(sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' data.xml) 

Массив может быть выполнен:

${sedcmd1[@]} 

Если вы не уверены, если вы определили ваш характер массива, вы всегда можете увидеть, что в нем, используя команду declare;

declare -p sedcmd1 

, который дает:

declare -a sedcmd1='([0]="sed" [1]="-i" [2]="" [3]="/<PromptOnUpdate>true<\\/PromptOnUpdate>/G" [4]="data.xml")' 
Смежные вопросы