$@を引用符で囲む方法は?

$@を引用符で囲む方法は?

私のbashスクリプトは次のとおりです。

#!/bin/bash
grep -r --color=always $@ . | nolong

ファイルは次の場所に保存されます。/usr/bin/findstr

これを実行すると、すべてがうまく動作します。

findstr hello

しかし、私がこれを実行した場合:

findstr hello world

helloだけを検索します。

質問:$@単一のパラメータであることを理解するために引用符を追加するにはどうすればよいですか?

答え1

正規表現(たとえば、引数の間にスペース文字を連結)を検索するには、次のようにします。

#! /bin/sh -
IFS=' ' # used for "$*"
grep -r --color=always -e "$*" . | nolong

"$*"位置引数を最初の文字に関連付けます(実際にはバイトを除いてyash$IFS

以下を実行すると(スペースの意味が混乱しているように見えるため)、次の点に注意してください。

myscript hello world
myscript hello  world
myscript 'hello'   "world"

スペース(または引用符)は渡されず、myscriptシェルのコマンドライン構文の一部にすぎません。これら3つのシェルコマンドラインには、myscript「myscript」、「hello」、および「world」という同じ3つのパラメータがあります。

パラメータとして渡された正規表現を検索するには、次の手順を実行します。

#! /bin/sh -
for i do
  set -- "$@" -e "$i"
  shift
done
[ "$#" -gt 0 ] && grep -r --color=always "$@" . | nolong

答え2

スクリプトを呼び出すときは、パラメータを引用して、2つの個別のパラメータではなく1つのパラメータであることを示す必要があります。スクリプトではを使用する必要があります"$@"

grep -r --color=always "$@" . | nolong

電話は(例えば)...

findstr "hello world"

(しかし、grepモードは1つの引数しか取らないので、"$1"代わりに"$@"十分です。)

関連情報