C-shell中的脚本变量

时间:2013-05-05 13:30:13

标签: shell unix grep csh

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

产生不同的结果?

3 个答案:

答案 0 :(得分:1)

在转到shell脚本之前,

a*将在shell中展开。因此,my_grep a*只会为您的脚本处理以a开头的第一个文件。另一方面,cat a*将适用于以a*开头的所有文件。您可以将脚本更改为cat $*,这样可以获得所需的结果。

答案 1 :(得分:1)

那是因为$1第一个参数,而不是所有参数。

shell会在脚本看到它之前将通配符扩展为单个文件。

因此,如果您有以下两个文件a1a2,则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应该如上所示。