bash -c を使用して、bash 関数に複数のパラメータを渡すことはできますか?

bash -c を使用して、bash 関数に複数のパラメータを渡すことはできますか?

私は以下のbash -cコマンドと関数を使用しています:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

for i in {1..5}
do
bash -c "fun" $i &
done

私の質問は、? を使用して関数に複数のパラメータを渡すことができるかどうかですbash -c。例:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

var="string"  #variable

for i in {1..5}
do
bash -c "fun" $i $var &
done

答え1

実際にコードを実行しましたか? 両方のスニペットが返されますfun: command not foundが、これが最初に対処する必要がある問題です。

fun関数としてエクスポートしたり、定義したりしない限り他の場所内部の人がコマンドを認識できるような方法でbash(詳しくは述べません)。この状況は非常に誤解を招くものであり、今後の問題を考えると残念なことです。

おそらくあなたが望んでいることを実行する簡単なコードから始めましょう:

#!/bin/bash

fun ()
{
   echo "$1"
}

for i in {1..5}
do
   fun "$i" &
done

数字が順番どおりに表示されない場合は、 が原因です。元のコードにあったため、ここで を&使用しました。&

関数の定義は文法的には問題ありません。私の定義で$1は の代わりにを使用しています$0が、これについては後で説明します。関数を使用するには、引数の有無にかかわらず、その名前を呼び出すだけです。私たちの場合:

fun
fun arg1
fun arg1 arg2

関数 内では$1$2、… がそれぞれの引数に展開されます。すべての引数を取得するには$@、 (または、$*何をしているかわかっている場合は ) を使用します。 引数の数を取得するには を使用します$#。 これは、 がシェル スクリプトである状況と非常によく似ていますfun

$0関数内のものは$0メインシェルのものです。関数に渡される引数とは関係ありません。

サブシェルで関数を実行できます。

( fun arg1 )

またはバックグラウンドで(暗黙的にサブシェルでも実行されます):

fun arg1 &

funがメインシェルの関数である場合、これらのサブシェルは、コマンドが である場合に何を行うべきかも認識しますfun。一方、 で開始されたシェルはbash -cを認識しませんfun

export繰り返しますが、 …または…を達成しない限り、

あなたの場合はbash -cむしろ障害です。それを使用する意味がわかりません。動作させることは可能ですが、面倒です。それでも、あなたの明示的な質問は次のとおりです:

を使用して関数に複数のパラメータを渡すことはできますかbash -c?

できます。以下に面倒な例を示します。関数が若干異なることに注意してください (教育上の理由により)。また、&結果がわかりにくくなるだけなので、省略しました。

#!/bin/bash

fun ()
{
   echo "$2"
}

export -f fun
var="string"

for i in {1..5}
do
   bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done

Bash から Bash に関数をエクスポートすることは可能であり、私たちはそれを実行しました。シェルが互換性を保ち、意図的にいくつかの環境変数を関数として解釈しない限り、Bash から別のシェルに関数をエクスポートすることは不可能です。

fun "$2" "$1"はシングルクォートで囲まれているため、メインシェルで"$2""$1"展開されません(シングルクォートであるため、彼らですない二重引用符) 。内部のコンテキストでは、bashこれら$2とが$1二重引用符で囲まれ、その後に提供されるパラメータinner-bash(ここでは任意の名前) に展開されます。

次のように保存された数値に何が起こるかを確認します$i

  • これは$iメインシェルのコンテキスト内にあります。
  • それは$1内部シェルのコンテキスト内にあります。
  • それは$2内部シェルの関数のコンテキスト内にあります。

ここで使用しても利点はなくbash -c、不便なだけです。このようにコードを複雑にしないでください。

もう一つ:変数を二重引用符で囲む

関連情報