5

私はシェル スクリプトを初めて使用します。パラメーターとして渡される連結された 2 つの文字列を返す単純な関数を作成しようとしています。以下のコードで試しました

   function getConcatenatedString() {
       echo "String1 $1"
       echo "String2 $2"
       str=$1/$2
       echo "Concatenated String ${str}"
       echo "${str}"
   }

//上記の関数を呼び出しています

  constr=$(getConcatenatedString "hello" "world")
  echo "printing result"
  echo "${constr}"
  echo "exit"

上記のコードでスクリプトを実行すると、以下の出力が表示されます。

   printing result
   String1 hello
   String2 world
   Concatenated String hello/world
   hello/world
   exit

コードを見ると、最初に関数を呼び出してから「印刷結果」ステートメントをエコーし​​ていますが、結果は最初に「印刷結果」になり、関数内のステートメントをエコーし​​ます。関数を呼び出す以下のステートメントですか

   constr=$(getConcatenatedString "hello" "world")

また

   echo ${constr}

関数を呼び出していますか?

#echo ${constr} をコメントアウトすると、何もエコーされないからです!!! 私を明確にしてください。

4

3 に答える 3

10

1 つ目は、関数を呼び出して、すべての出力 (4 つのechoステートメント) を に格納すること$constrです。

次に、戻った後、プリアンブルprinting result, $constr(4 行で構成される) と終了メッセージをエコーし​​ます。

それがどのよう$()に機能するかです。同封されたコマンドからの標準出力全体をキャプチャします。

echoステートメントの一部を .conf でキャプチャするのではなく、コンソールに表示したいようです$()。そのためには、それらを標準エラーに送信できるはずだと思います:

echo "String1 $1" >&2
于 2012-08-01T11:39:03.307 に答える
1

より柔軟ですが、理解するのが少し難しいアプローチは、変数名を渡し、変数evalが呼び出し元のコンテキスト (グローバルまたは関数ローカル) で設定されるように使用することです。バッシュで:

function mylist()
{
    local _varname=$1 _p _t
    shift

    for _p in "$@"; do
        _t=$_t[$_p]
    done

    eval "$_varname=\$_t"
}

mylist tmpvar a b c
echo "result: $tmpvar"

``私のLinuxデスクトップ(bash-3.2)では、後者にはプロセス作成のオーバーヘッドがあるため、を使用するよりも約3〜5倍高速(10,000回の反復)です。

bash-4.2 をdeclare -g使用している場合、関数でグローバル変数を設定できるため、unpretevalを次のように置き換えることができます。

declare -g $_varname="$_t"

このeval方法は、TCL の upvar 1およびdeclare -gに似ていupvar #0ます。

printf一部のシェルビルトインは、「-v」を使用した bash のように、出力をキャプチャする代わりに変数に直接割り当てることでプロセスの作成を節約するなど、同様のものをサポートしています (私にとっては約 20 ~ 25 倍高速です)。

于 2013-01-09T13:56:27.887 に答える
1

paxdiabloの解決策は正しいです。関数から文字列を返すことはできませんが、関数の出力をキャプチャしたり、呼び出し元が から取得できる整数値を返したりすることはできます$?。ただし、すべてのシェル変数はグローバルであるため、次のように簡単に実行できます。

getConcatenatedString() { str="$1/$2"; }      
getConcatenatedString hello world
echo "Concatenated String ${str}"

functionキーワードは と冗長ですが()function移植性が低いことに注意してください。

于 2012-08-01T14:19:02.177 に答える