set myname = '*' 后,为什么echo $myname return 是当前文件夹下所有脚本的名字?

After set myname = '*', why does echo $myname return the names of all scripts in the current folder?

我很惊讶地从我的 csh 代码 中得到以下输出:

set myname = '*'
echo $myname

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

myprogm1.py myprogrm2.py …

我想把一个简单的字符串交给我的名字:as star symbol '*'

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

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

set myname='*'
echo "$myname"

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

每日关键词:"metacharacters"。找到你的 shell 的元字符...它们在 Borne 和 C shell 之间有很大的不同。

Shell 会在每次执行行时扩展行。因此,虽然 myname 确实包含所需的星号,但当它在没有被引用的情况下展开时,shell 会看到一个孤立的星号并展开它。

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

另一个 "problem character" 是 space,尤其是在文件名中。如果不加引号,每个 space 都会导致扩展时断字。像

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