Как объединить строки вместе в csh?

Я хотел бы объединить строки вместе, чтобы создать командную строку в сценарии 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 как нечто вроде

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

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

Огромное спасибо,


person Cassie    schedule 09.11.2011    source источник
comment
Я не могу проверить это в своей среде, но вам придется указать (как минимум 1x) встроенные одинарные кавычки (т.е. cmdStr = "sed -i \' .... Чтобы действительно запустить $cmdStr, вам понадобится eval, верно? Удачи.   -  person shellter    schedule 10.11.2011
comment
Кроме того, включите отладку оболочки (хм... csh... set -vx как и все остальные оболочки?). Затем вы можете получить некоторое представление о том, как интерпретируются переменные. Удачи.   -  person shellter    schedule 10.11.2011
comment
Огромное спасибо. Прежде чем я захочу убить себя, это сработало. :) Я обнаружил, что могу успешно установить commandString, но не могу повторить это. Однако пока csh может устанавливать переменные, я доволен.   -  person Cassie    schedule 10.11.2011
comment
могу ли я опубликовать это как ответ, который вы примете? В любом случае рад, что помогло   -  person shellter    schedule 10.11.2011
comment
Да. Пожалуйста, сделайте это. Мне жаль, что я не знаю, как изменить его, чтобы он был ответом, который я принял. Если вы знаете, как это сделать, пожалуйста, сделайте это. Спасибо,   -  person Cassie    schedule 10.11.2011
comment
Вы не можете принять мой комментарий, но теперь я добавил ту же информацию, что и ответ ниже. Пожалуйста, примите и проголосуйте, как считаете нужным. Спасибо и удачи.   -  person shellter    schedule 10.11.2011


Ответы (4)


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

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

#!/bin/csh -vx

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

person shellter    schedule 10.11.2011

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

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

person Jay    schedule 09.11.2011
comment
Я меняю commandString, как уже упоминалось. Однако csh пожаловался на эхо: нет совпадения, поэтому кажется, что commandString не установлена ​​успешно. - person Cassie; 10.11.2011

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

 echo $commandString

andenter code hereecho "$commandString"

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

person Community    schedule 12.11.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"
person Community    schedule 12.11.2012