Bash変数からローカル値を返しますか?

Bash変数からローカル値を返しますか?

私はこの記事を調べました。Bash 関数の戻り値。データ

Lorem.
\begin{document}
hello
\end{document}

ケース#1は機能しません

パスワード

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
}

START2=$(getStart)
echo $START2

空行を誤って返します。私は予測する1スクリプトが空行を返すのはなぜですか?

ケース#2の操作

パスワード

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
        echo $START
}

getStart

正しく印刷されます1

チョロバ回答出力

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
        echo $START
}

START2=$(getStart)
echo $START2

行番号は一度だけ提供され、これは予想される結果ではありません。二度はやるべきだと思います。

答え1

$(...)(別名「コマンドの置き換え」)はコマンドの出力をキャプチャします...。変数に値を割り当てると出力が生成されないため、キャプチャする内容はありません。 #2の場合、echo出力が生成されます。

getStart () {
    local l=Hallo
    echo $l
}

v=$(getStart)
echo $v

更新に応答するには:function outputHalloこの出力はコマンド置換によってキャプチャされます。なぜなら、それはコマンド置換の役割であるからです。したがって、v=$(getStart)スクリプトはそれまで何の出力も生成しません。その後、対応する行がecho $v出力されますHallo

答え2

ただawkコマンドを実行してキャプチャすることを忘れてください。関数は何かをエコーでき、さらに終了ステータスを返します。明示的に返されない場合(例:)、return 1関数の終了状態は最後のコマンドの終了状態になります。これがおそらく関数からキャプチャ+エコーを望まない理由です。エコー終了ステータス(例外がない限り0)を使用して、キャプチャコマンドの終了ステータスを非表示にします。

答え3

local+では、変数から-nessを削除する単純な関数を使用できます。unsetset

function return_local()
{
  unset $1 # must be local
  eval "$1=\"\$2\""
}

evalnotを使用する必要があります。declareこれは、ローカルではなくエクスポートされていない変数を生成する必要があるときに、ローカル変数またはエクスポートされた変数を生成するためです。

function test()
{
  local my_return_value=123
  # ...
  return_local my_return_value "$my_return_value"
}

このunsetディレクティブは最も内側の変数を削除するため、ローカル変数を返すすべての関数に書き込むlocal必要があります。return_localしたがって、return_local入れ子になった呼び出しコンテキストで使用できます。

$(...)別々のプロセスを作成するだけで、演算子を使用する必要がなくなり、プロセス生成コストが安くないWindowsでbashのパフォーマンスが低下します。

関連情報