有一个 my_grep 脚本
#!/bin/csh
cat $1 | grep -i -E " a | b "
怎么来的
cat a* | grep -i -E " a | b " > out1.txt
和
my_grep a* > out2.txt
产生不同的结果?
a*
在进入 shell 脚本之前将在 shell 中展开。因此,my_grep a*
将只给出第一个文件以a
由您的脚本处理。另一方面,cat a*
将对所有以a*
. 您可以将脚本更改为cat $*
,这将达到预期的结果。
那是因为$1
是第一个论点,而不是所有论点。
在您的脚本看到通配符之前,shell 会将通配符扩展为单独的文件。
因此,如果您有以下两个文件a1
and a2
,该命令my_grep a*
会将您的两个文件放入$1
and $2
,您的脚本将只处理第一个文件。
它们不同,因为您只$1
在 my_grep 脚本中处理 FIRST glob 扩展...您的 my_grep 应该是:
#!/bin/csh
cat $* | grep -i -E " a | b "
$* 是传递给 my_grep 的所有命令行参数。
命令行外壳(您实际键入的地方my_grep a*
是将 a* 扩展到所有以开头的文件名,a
因此假设您有afoo
abar
并且abaz
在您的目录中,然后:
cat a* | grep -i -E " a | b "
本质上等同于:
cat abar abaz afoo | grep -i -E " a | b "
同样,当您执行 my_grep a*
相当于
my_grep abar abaz afoo
所以在你的shell脚本中cat $1
意味着只是cat abar
而不是cat abar abaz afoo
$*
相当于$argv
(相当于$argv[*]
)。
所以你的 my_grep 应该如上所示。