0

以下を使用する場合:

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

read を使用してユーザー変数を定義する代わりに、スクリプトを呼び出すときに最初の変数とともに 2 番目の変数を入力するにはどうすればよいでしょうか。

たとえば、私が得ることができると信じている理想的な使用法は次のようなものです。

sh scriptname var1 var2

しかし、私の理解では、 for... 行は、後続の全体を 1 つの変数にループするためのものです。複数の変数を入力するには、何を変更する必要がありますか?

4

2 に答える 2

2

コマンドラインで渡されたパラメーターを$1 $2etcで取得できます。

位置パラメータについては、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. 複数のファイルから 1 つの文字列を検索しますか? または、
  2. 1 つのファイルで複数の文字列を検索しますか?

前者の場合、次のように動作する可能性があります。

#!/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

もちろん、文字列を or バーで連結してから egrep を使用すると、これは合理化される可能性があります。あなたが実際に探しているものに依存します。

于 2013-02-09T22:58:40.750 に答える