设置myname =' *'之后,为什么echo $ myname会返回当前文件夹中所有脚本的名称?

时间:2015-07-31 00:02:17

标签: csh

我很惊讶从 csh代码获得以下输出:

set myname = '*'
echo $myname

这会打印出我执行bash脚本的文件夹中所有脚本名称的列表:

myprogm1.py myprogrm2.py …

我想将一个简单的字符串移交给myname:as star symbol '*'

如何阻止我的脚本打印名称列表并将*解释为字符串?

2 个答案:

答案 0 :(得分:3)

实际上,由于单引号,您的变量正确地将星号作为值。但是,当您调用echo时,星号会扩展为通配符并匹配每个文件。要避免它,只需将变量放在双引号之间:

set myname='*'
echo "$myname"

(请注意,有很多differences between csh and bash syntax。)

答案 1 :(得分:0)

每日一词:“元字符”。找到shell的元字符......它们在Borne和C shell之间存在很大差异。

每次执行该行时,外壳都会展开行。因此,虽然myname确实包含所需的星号,但是当它被展开而没有被引用时,shell会看到一个孤立的星号并展开它。

如果你经常在命令行中无情地引用变量,你可以避免各种各样的问题。

另一个“问题字符”是空格,尤其是在文件名中。如果没有引用,则每个空格都会在扩展时导致单词中断。像

这样的命令非常糟糕
  set a = "hello world"
  set b = "foo bar"
  cp "$a" $b;       # becomes cp "hello world" "foo" "bar"
  rm $a;            # becomes rm "foo" "bar"