我想将字符串连接在一起以在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
然后,此commandString将插入另一个脚本文件file2.csh中。 file2.csh是实际的脚本文件,它执行Hat的价格替换命令。此外,var1和var2的值是从priceUpdateList.txt文件中读取的,因此它们不是固定值。换句话说,我不能简单地在commandString变量中键入Hat和100。有谁知道如何正确使用引号在csh中生成命令字符串?
非常感谢你,
答案 0 :(得分:1)
您必须引用(至少1x)嵌入的单引号(即cmdStr = "sed -i \' ....
要实际运行$ cmdStr,您需要eval
吗?
要在csh中使用shell调试(我建议您查看发生了什么),请将脚本中的第一行更改为
#!/bin/csh -vx
这将显示执行时的每行代码或代码块,然后扩展环境变量的相同代码块。
答案 1 :(得分:0)
怎么样: set embeddedString =“s,$ var1 =。*,$ var1 = $ var2,g” set commandString =“sed -i'$ embeddedString'productPrice.txt”
如果你愿意,可以在embeddedString中使用/代替: - )
答案 2 :(得分:0)
非常简单:
您的目标是将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"
答案 3 :(得分:0)
抱歉,我忘了解释Cassie引用的No Match
之间的区别 echo $commandString
和enter code here
echo“$ commandString”
是第一个回应正确构建的命令的结果(当然不匹配,因为它需要读取一个名为productPrice.txt的缺席文件,而第二个,用双引号嵌入命令,显示命令本身这就是要求的。