使用以下内容时:
for what in $@; do
read -p "Where?" where
grep -H "$what" $where -R | cut -d: -f1
如何在调用脚本时,不使用read来定义用户变量,而是在调用脚本时有第二个变量输入和第一个变量。
例如,我相信我能得到的理想用法是:
sh scriptname var1 var2
但我的理解是for ... line用于将后续entires循环到一个变量中;我需要更改输入多个变量?
答案 0 :(得分: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
等。
答案 1 :(得分: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
清晰度......没有。
所以......让我们澄清一下你在寻找什么。
如果是前者,则以下内容可能有效:
#!/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,这个可能会简化。取决于你真正想要的东西。