Как объединить строки в csh? - PullRequest
1 голос
/ 10 ноября 2011

Я хотел бы объединить строки, чтобы создать командную строку в сценарии csh file1.csh.Тем не менее, csh продолжает жаловаться на ошибки для переменной commandString, и я действительно не знаю, что я сделал неправильно.Вот часть кодов.

set var1 = "Hat"
set var2 = 100
set embeddedString = 's/'$var1' =.*$/'$var1' = '$var2'/g'
set commandString = "sed -i ' "$embeddedString" ' productPrice.txt"
echo $commandString

Моя цель - установить для параметра commandString vairable что-то вроде

sed -i 's/Hat =.*$ /Hat = 100/g' productPrice.txt 

Затем эта commandString будет вставлена ​​в другой файл сценария file2.csh,file2.csh - это файл сценария, который выполняет команду замены цены Hat.Кроме того, значения var1 и var2 считываются из файла priceUpdateList.txt, поэтому они не являются фиксированными значениями.Другими словами, я не могу просто ввести Hat и 100 в переменную commandString.Кто-нибудь знает, как правильно использовать кавычки для генерации командной строки в csh?

Большое спасибо,

Ответы [ 4 ]

1 голос
/ 10 ноября 2011

Вам нужно будет заключить в кавычки (по крайней мере 1x) встроенные одинарные кавычки (т.е. cmdStr = "sed -i \' ....). Для запуска $ cmdStr вам понадобится eval верно?

Для использования оболочкиотладка в csh (которую я бы порекомендовал посмотреть, что происходит), измените первую строку в вашем скрипте на

#!/bin/csh -vx

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

0 голосов
/ 12 ноября 2012

Извините, я забыл объяснить отсутствие совпадений, цитируемое Кэсси. Разница между

 echo $commandString

и enter code here echo "$ commandString"

заключается в том, что первый выводит результатправильно построенная команда (конечно, нет совпадения, потому что она должна прочитать отсутствующий файл с именем productPrice.txt, в то время как вторая, встраивая команду в двойные кавычки, показывает саму команду, что и было запрошено.

0 голосов
/ 12 ноября 2012

Очень просто:
Ваша цель - установить commandString переменную как

sed -i 's/Hat =.*$ /Hat = 100/g' productPrice.txt 

Ниже делает это и печатает commandString для сравнения с вашей целью ...

Кроме того, все ваши кавычки бесполезны, кроме тех, которые разделяют ваши "окончательные" строки.
Но в основном обратите внимание на пропущенный пробел между .*$ and /$var1 Достаточно обмануть интерпретатора, который увидел строку с именем $ / , а имена строк должны начинаться с буквы.

set var1 = "Hat"
set var2 = 100
set embeddedString = "s/$var1 =.*$ /$var1 = $var2/g"
set commandString  = "sed -i $embeddedString  productPrice.txt"
echo  "$commandString"
0 голосов
/ 10 ноября 2011

как насчет: set embeddedString = "s, $ var1 =. *, $ Var1 = $ var2, g" set commandString = "sed -i '$ embeddedString' productPrice.txt"

, которые вы можете использовать/ вместо встроенной строки, если вы хотите: -)

...