有一个 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 会将通配符扩展为单独的文件。
因此,如果您有以下两个文件a1and a2,该命令my_grep a*会将您的两个文件放入$1and $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 应该如上所示。