私の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"
代わりに"$@"
十分です。)