1

我想将字符串连接在一起以在 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 文件中读取的,因此它们不是固定值。换句话说,我不能简单地在 commandString 变量中键入 Hat 和 100。有谁知道如何正确使用引号在 csh 中生成命令字符串?

非常感谢你,

4

4 回答 4

1

您必须引用(至少 1x)嵌入的单引号(即cmdStr = "sed -i \' ....要实际运行 $cmdStr 您将需要eval对吗?

要在 csh 中使用 shell 调试(我建议看看发生了什么),请将脚本中的第一行更改为

#!/bin/csh -vx

这将在执行时向您显示每一行或代码块,然后是扩展了环境变量的同一代码块。

于 2011-11-10T19:36:44.957 回答
0

怎么样: set embeddedString="s,$var1 =.*,$var1 = $var2,g" set commandString="sed -i '$embeddedString' productPrice.txt"

如果需要,您可以在 embeddedString 中使用 / 而不是 , :-)

于 2011-11-09T20:55:51.040 回答
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"
于 2012-11-12T18:34:21.190 回答
0

对不起,我忘了解释 Cassie 引用的 No Match 之间的区别

 echo $commandString

enter code here回显“$commandString”

是第一个回显正确构建命令的结果(当然不匹配,因为它需要读取一个不存在的文件 `named productPrice.txt ,而第二个将命令嵌入双引号中,显示命令本身,即要求什么。

于 2012-11-12T18:44:09.910 回答