私はこの記事を調べました。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を削除する単純な関数を使用できます。unset
set
function return_local()
{
unset $1 # must be local
eval "$1=\"\$2\""
}
eval
notを使用する必要があります。declare
これは、ローカルではなくエクスポートされていない変数を生成する必要があるときに、ローカル変数またはエクスポートされた変数を生成するためです。
function test()
{
local my_return_value=123
# ...
return_local my_return_value "$my_return_value"
}
このunset
ディレクティブは最も内側の変数を削除するため、ローカル変数を返すすべての関数に書き込むlocal
必要があります。return_local
したがって、return_local
入れ子になった呼び出しコンテキストで使用できます。
$(...)
別々のプロセスを作成するだけで、演算子を使用する必要がなくなり、プロセス生成コストが安くないWindowsでbashのパフォーマンスが低下します。