0

使用以下内容时:

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

在调用脚本时,如何不使用 read 来定义用户变量,而是将第二个变量输入与第一个变量一起输入。

例如,我相信我能得到的理想用法是:

sh scriptname var1 var2

但我的理解是 for... 行用于将后续的整体循环到一个变量中;我需要改变什么来输入多个变量?

4

2 回答 2

2

$1 $2您可以使用等获取在命令行上传递的参数。

阅读位置参数:http ://www.linuxcommand.org/wss0130.php 。您不需要 for 循环来解析它们。

sh scriptname var1 var2

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

$@基本上只是所有位置参数的列表:$1 $2 $3等。

于 2013-02-09T22:43:55.497 回答
2

顺便说一句:使用| cut -D: -f1是不安全的,因为 grep 不会转义文件名中的冒号。要明白我的意思,你可以试试这个:

ghoti@pc:~$ echo bar:baz > foo
ghoti@pc:~$ echo baz > foo:bar
ghoti@pc:~$ 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 "$@"; 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 "$@"; do
  grep -lR "$what" "$where"
done

当然,如果你用一个或小节连接你的字符串,然后使用 egrep,这个可能会被简化。取决于你真正在寻找什么。

于 2013-02-09T22:58:40.750 回答