考虑以下两个tcsh脚本。
SCRIPT1:
setenv MYVAR `echo "str"
SCRIPT2:
setenv MYVAR `echo "str*"`
第一个完成没有错误。第二个得到了#34;没有匹配"错误,因为shell无法找到匹配" str *"的任何文件。如何在这种情况下避免错误,以便MVAR的内容为" str *"?
请注意,我可以在这里消除反引号和回声。这是一个问题的抽象,我试图在另一个无法轻易删除的环境中进行调试。
答案 0 :(得分:0)
你必须引用反引号。这比听起来更难,因为tcsh不会让你嵌套双引号。
您可以重写查询,使其适合双引号:
setenv MYVAR "`echo "\""str*"\""`"
或利用多种类型的报价:
setenv MYVAR "`echo 'str*'`"
或遵循twalberg的建议并使用更好的外壳。
答案 1 :(得分:0)
在tcsh中,你经常想要在双引号("..."
)内执行“特殊”操作(反引号,变量替换等)(但不是单引号,这会禁用大多数神奇的。)
在您的情况下,您需要在变量赋值和变量替换中使用双引号。
% setenv AA "`echo 'str*'`"
% echo "$AA"
str*
在第一行中,我们通过使用单引号来避免*
- 扩展。我们也可以使用反斜杠*
来逃避\
(如@ twalberg的答案)并删除单引号。 (一般来说,我们也可以使用双引号,但在这种情况下,它们会与外部双引号发生冲突)。
然后,正如我已经说过的,我们在setenv
表达式周围使用双引号,在第二行中使用变量替换。
是的,社会希望你认为你是使用tcsh的可怕人类。这只是社会喜欢做的事情之一。