0

有一个 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

产生不同的结果?

4

3 回答 3

1

a*在进入 shell 脚本之前将在 shell 中展开。因此,my_grep a*将只给出第一个文件以a由您的脚本处理。另一方面,cat a*将对所有以a*. 您可以将脚本更改为cat $*,这将达到预期的结果。

于 2013-05-05T13:37:20.763 回答
1

那是因为$1是第一个论点,而不是所有论点。

在您的脚本看到通配符之前,shell 会将通配符扩展为单独的文件。

因此,如果您有以下两个文件a1and a2,该命令my_grep a*会将您的两个文件放入$1and $2,您的脚本将只处理第一个文件。

于 2013-05-05T13:38:38.573 回答
1

快速解决方案:

它们不同,因为您只$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 应该如上所示。

于 2013-05-05T13:41:02.800 回答