使用以下内容时:
for what in $@; do
read -p "Where?" where
grep -H "$what" $where -R | cut -d: -f1
在调用脚本时,如何不使用 read 来定义用户变量,而是将第二个变量输入与第一个变量一起输入。
例如,我相信我能得到的理想用法是:
sh scriptname var1 var2
但我的理解是 for... 行用于将后续的整体循环到一个变量中;我需要改变什么来输入多个变量?
$1
$2
您可以使用等获取在命令行上传递的参数。
阅读位置参数:http ://www.linuxcommand.org/wss0130.php 。您不需要 for 循环来解析它们。
sh scriptname var1 var2
v1=$1 # contains var1
v2=$2 # contains var1
$@
基本上只是所有位置参数的列表:$1 $2 $3
等。
顺便说一句:使用| 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
清晰度..没有。
所以......让我们澄清你在寻找什么。
如果是前者,那么以下可能有效:
#!/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,这个可能会被简化。取决于你真正在寻找什么。