bash / ash関数に渡された引数はどうなりますか?

bash / ash関数に渡された引数はどうなりますか?

この答えは ---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

おすすめ記事