有一个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
产生不同的结果?
答案 0 :(得分:1)
a*
将在shell中展开。因此,my_grep a*
只会为您的脚本处理以a
开头的第一个文件。另一方面,cat a*
将适用于以a*
开头的所有文件。您可以将脚本更改为cat $*
,这样可以获得所需的结果。
答案 1 :(得分:1)
那是因为$1
是第一个参数,而不是所有参数。
shell会在脚本看到它之前将通配符扩展为单个文件。
因此,如果您有以下两个文件a1
和a2
,则my_grep a*
命令会将两个文件提供给$1
和$2
,你的脚本只处理第一个。
答案 2 :(得分:1)
它们之所以不同,是因为你只是在my_grep脚本中引用FIRST glob扩展$1
...
你的my_grep应该是:
#!/bin/csh
cat $* | grep -i -E " a | b "
$ *是传递给my_grep的所有命令行参数。
命令行shell(您实际键入my_grep a*
的地方)正在将a *扩展为以a
开头的所有文件名,所以假设您有afoo
{{1}然后在你的目录中找到}和abar
:
abaz
基本上相当于:
cat a* | grep -i -E " a | b "
同样当你执行my_grep a *
时它相当于
cat abar abaz afoo | grep -i -E " a | b "
所以你的shell脚本my_grep abar abaz afoo
意味着只有cat $1
而不是cat abar
cat abar abaz afoo
相当于$*
(相当于$argv
)。
所以你的my_grep应该如上所示。