この答えは ---
POSIXシェルの使用に関する有用な情報をたくさん提供します。すべてのパラメータをスクリプトに渡す方法への答えです。その結果、次のような機能が発生します。
my_echo()
{
set -x
echo $@ " " \"$@\"
echo `ps | grep -- "$@" | grep -v grep | awk '{ print $1 }'` 2>/dev/null
set +x
}
my_echo logread -f
私はOpenWRT用にこのスクリプトを書いています。再出力ショー
+ echo logread -f "logread -f"
logread -f "logread -f"
+ ps
+ grep -v grep
+ awk { print $1 }
+ grep -- logread -f
grep: -f: No such file or directory
+ echo
+ set +x
うーん... grepコマンドに追加した引用符が消えました(logread -f引用符はありません)。
Bashでこの機能を試してみました。
+ echo logread -f ' ' '"logread' '-f"'
logread -f "logread -f"
++ ps
++ grep --color=auto -- logread -f
++ grep --color=auto -v grep
++ awk '{ print $1 }'
grep: -f: No such file or directory
+ echo
+ set +x
面白いですね…おそらく私の主張が個別に分析されているのではないでしょうか?この理論をテストするために、私は以下を試しました。
my_echo "logread -f"
大きい打撃出力:
+ echo logread -f ' ' '"logread' '-f"'
logread -f "logread -f"
++ ps
++ grep --color=auto -- 'logread -f'
++ grep --color=auto -v grep
++ awk '{ print $1 }'
+ echo
+ set +x
echoコマンドの出力は変更されていません(バージョンset
または実際の出力ですが、logread -f
今は二重引用符で囲まれたものとして扱われているようです。set
) 。
再出力:
+ echo logread -f "logread -f"
logread -f "logread -f"
+ ps
+ grep -v grep
+ awk { print $1 }
+ grep -- logread -f
+ echo
+ set +x
今私は私が期待していたものを取得します。二重引用符(単一引数)として渡された引数を使用すると、my_echo
次のように実行されます。
my_echo_new()
{
echo `ps | grep -- "$1" | grep -v grep | awk '{ print $1 }'` 2>/dev/null
}
my_echo_new "logread -f"
だから...問題はいくつかのパラメータを扱うようです。ここで何が起こっているのでしょうか?これは`の結果ですか、それとも関数呼び出しの結果ですか、それとも別のものですか?両方の場所に二重引用符が必要なのはなぜですか?
答え1
"$@"
次に展開リスト引用符付きの文字列。 2つの引数logread
を-f
関数に渡すと、"$@"
次のように拡張されます。二つひも。
したがって、実行中はにgrep -- "$@"
拡張されますgrep -- logread -f
。これは、「logread
名前付きファイルのgrep for」を意味します-f
。
"$*"
単一の文字列の代わりに別々のパラメータを渡し、パラメータを一重引用符で囲んだ文字列に展開しますか?
grep -e "$*"
使用すると、位置引数は最初の文字で区切られますgrep -e "logread -f"
(デフォルトでは空白)。また、または$IFS
"$*"
$*
$@
引用しない無意味。
pgrep
ただし、ここで/を使用することもできますpkill
。
if ! pgrep -xf "$*" >/dev/null; then
printf 'No process matches "%s" exactly\n' "$*"
fi