我可以像这样使用 tcsh 中的 sed:
set a = `echo $a | sed -e 's_old_new_'`
一切都很好,但是当我想这样做时:
set a = `echo $a | sed -e 's_old_*new_'`
我可以看到“设置:不匹配”。. 我怎样才能逃离这颗星星?
我对 tcsh 了解不多,但很少有实验表明分配变量的集合尝试扩展右侧 *. 这可能会有所帮助:
set a="`echo '2e2' | sed -e 's_e_*_'`"
echo "$a"
2*2
echo $a
echo: No match.
所以在反引号周围加双引号,它会起作用。
set a = "`echo $a | sed -e 's_old_new_'`"
未包含在双引号中的命令替换(`
或$(..)
)受文件名扩展(又名“通配符”)和分词的影响。
通常,变量赋值会抑制 RHS 的文件名扩展和分词(即使没有双引号),但在命令替换的情况下显然不会文件名扩展。
这是我为参考目的而运行的测试:
$ touch randomfile
$ a="*file"
$ var_expand=$a
$ echo "$var_expand"
*file
$
$ cmd_subst=$(echo '*file')
$ echo "$cmd_subst"
randomfile
所以我想当你分配给变量时总是双引号命令替换是一个好习惯。
safe="$(cmd)"
注意:这是在 Bash 中测试的,但我认为 tcsh 在这方面表现出类似的行为。