循环输入中有多个变量?

时间:2013-02-09 22:39:13

标签: linux bash shell

使用以下内容时:

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

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

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

sh scriptname var1 var2

但我的理解是for ... line用于将后续entires循环到一个变量中;我需要更改输入多个变量?

2 个答案:

答案 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

清晰度......没有。

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

  1. 您想在多个文件中搜索一个字符串吗?或者,
  2. 您想在一个文件中搜索多个字符串吗?
  3. 如果是前者,则以下内容可能有效:

    #!/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,这个可能会简化。取决于你真正想要的东西。