2012-01-11 3 views
3

Я пробовал следующее в командной строке, и они работают, но когда я помещаю их в сценарий bash, я получаю сообщение об ошибке (см. Ниже):Sed in bash скрипт не работает: но он работает в командной строке

sed -e "s/INSERT_ME_HERE/"${ROOT_BUILD_HOME}"/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile 
sed -e "s/INSERT_ME_HERE/'${ROOT_BUILD_HOME}'/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile 
sed -e "s/INSERT_ME_HERE/`echo ${ROOT_BUILD_HOME}`/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile 

ошибка я получаю:

sed: -e expression #1, char 19: unknown option to `s' 

Однако, как я сказал, я использую его из командной строки, и она работает:

[[email protected] Doxygen]$ ROOT_BUILD_HOME=MONKEY; sed -e "s/INSERT_ME_HERE/`echo ${ROOT_BUILD_HOME}`/g" ./Doxyfile | grep MONKEY 
INPUT     = MONKEY 

Почему это работает в одном случае, а не в другом?

Также установлен ROOT_BUILD_HOME, я эхо направо перед выражением sed внутри скрипта оболочки.

echo `date`: "Going to run doxygen on source and move to ${ROOT_BUILD_HOME}"; 
+0

Просто примечание стороны:. Вместо использования '/ tmp' вы должны дать' mktemp' попробовать для таких потому что это повышает безопасность и надежность ваших скриптов. – mschilli

ответ

5

Я предполагаю, что ROOT_BUILD_HOME начинается с /, который sed толкует, как окончание вашей замены строки. Я прав? Если это так, то попробуйте использовать другой разделитель:

sed -e "s#INSERT_ME_HERE#${ROOT_BUILD_HOME}#g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile 
+0

Это трюк сэр +1 для вас. Однако вы все еще можете объяснить, почему он будет работать в командной строке, а не в скрипте? –

+0

@Matthew, потому что он только терпит неудачу, если значение ROOT_BUILD_HOME содержит косую черту. Значение в скрипте делает, но «MONKEY» этого не делает. –

+0

вы можете избежать этого \ /. Или создайте цепочку sed с заменой/с помощью \/что-то вроде echo/home/| sed -e '/ \ // \\\ // g' –

1
#!/bin/bash 

ABC=`echo ${ROOT_BUILD_HOME}` 
echo $ABC 
sed -e 's/INSERT_ME_HERE/'$ABC'/g' <./Doxyfile > ./tmp && mv ./tmp ./Doxyfile 

надеюсь, что это помогает

+0

Надеюсь, что это даст вам более глубокое представление о том, почему это работает над скриптом:) –

+0

Я не понимаю, для чего вам нужна переменная 'ABC'. Что было бы иначе, если бы вы заменили первые две строки на 'echo $ {ROOT_BUILD_HOME}' или даже 'echo $ ROOT_BUILD_HOME'? – mschilli

Смежные вопросы