2013-02-09 116 views
0

当使用下列内容:循环输入中有多个变量?

for what in [email protected]; do 
read -p "Where?" where 
grep -H "$what" $where -R | cut -d: -f1 

我如何,而不是使用读来定义一个用户变量,调用脚本的时候有第二个变量输入与第一变量一起。

例如,理想的使用,我相信我能得到的是这样的:

sh scriptname var1 var2 

但我的理解是,对...行是循环的后续entires到一个变量;我需要更改输入多个变量?

+0

那么你想访问传递给脚本的命令行参数吗? – 2013-02-09 22:42:58

+0

是的,谢谢;我似乎无法表达我在做什么。例如,我希望能够将第一个参数传递给第一个变量位置,第二个等等。 – 2013-02-09 22:44:18

回答

2

顺便说一句:使用| cut -D: -f1并不安全,因为grep的不逃避在文件名中的冒号。看看我的意思,你可以试试这个:

[email protected]:~$ echo bar:baz > foo 
[email protected]:~$ echo baz > foo:bar 
[email protected]:~$ grep -Hr ba . 
./foo:bar:baz 
./foo:bar:baz 

明确..没有。

所以...让我们澄清你在找什么。

  1. 是否要在多个文件中搜索一个字符串?或者,
  2. 是否要在一个文件中搜索多个字符串?

如果是前者,那么下面可能的工作:

#!/bin/bash 

if [[ "$#" -lt 2 ]]; then 
    echo "Usage: `basename $0` string file [file ...] 
    exit 1 
fi 

what="$1" 
shift  # discard $1, move $2 to $1, $3 to $2, etc. 

for where in "[email protected]"; do 
    grep -HlR "$what" "$where" -R 
done 

而如果是后者,那么这将是这样:

#!/bin/bash 

if [[ "$#" -lt 2 ]]; then 
    echo "Usage: `basename $0` file string [string ...] 
    exit 1 
fi 

where="$1" 
shift 

for what in "[email protected]"; do 
    grep -lR "$what" "$where" 
done 

当然,这其中可能会被精简如果你用一个或者一个条连接你的字符串,然后使用egrep。取决于你实际寻找的东西。

+0

我应该澄清:目的是在给定目录中搜​​索指定字符串存在匹配的文件,其中输出只是字符串存在的文件名。感谢您的小费;考虑到这一点,我会做出一些改变,但我想我或多或少地找到了我想要的东西。 – 2013-02-09 23:02:47

+0

那么......单个目录和单个文件? '$ @'来到哪里? – ghoti 2013-02-09 23:26:12

+0

那么,我或多或少只是重新使用了一个我以前的脚本中使用过的东西,我错误地理解了它的目的;在任何情况下,我都希望替换$ @部分,并且我能够对此问题使用其他答案。我很抱歉我之前对这个问题的解释。 – 2013-02-09 23:31:03

2

你可以得到的参数在命令行上通过与$1$2

定位参数读了起来:http://www.linuxcommand.org/wss0130.php。你不需要for循环来解析它们。

sh scriptname var1 var2 

v1=$1 # contains var1 
v2=$2 # contains var1 

[email protected]基本上是一个所有的位置参数的清单:$1 $2 $3

+0

谢谢,这正是我所需要的。 – 2013-02-09 22:56:34