関数にはbashの戻り値はありません。あなたが書くとき
current=$(get_last_name "$path")
に戻り値を割り当てていませんcurrent
。get_last_name
(コマンドを使用して記述された)の標準出力をキャプチャし、echo
に割り当てていcurrent
ます。そのため、「名前を取得」は表示されません。そのテキストは端末には届きませんが、に保存されcurrent
ます。
詳細な説明
最初に見ていきましょうget_last_name
(説明を簡単にするためにいくつかのわずかな変更を加えて):
function get_last_name () {
ipath=$1
local IFS='/'
set $ipath
for item
do
last=$item
done
echo "Get Last Name"
echo $last
}
変更がの本文に限定されるようlocal
に前にコマンドを追加し、2つのステートメントの類似性を強調するために、最初のコマンドを最後に移動しました。が呼び出されると、単一の引数(ファイルパスを含む文字列)が処理され、「GetLastName」とファイルパスの最後のコンポーネントの2つの文字列がエコーされます。コマンドラインからこの関数を実行すると、次のように表示されます。IFS
get_last_name
echo
echo
get_last_name
$ get_last_name /foo/bar/baz
Get Last Name
baz
関数の終了コードは、最後に実行されたコマンドの終了コード(この場合は)になりecho $last
ます。書き込みが成功する限り、これは0になります(ほぼ確実に成功します)。
次に、 :main
を呼び出す関数を見てみましょう。get_last_name
main() {
path='/var/lib/iscsi/ifaces/iface0'
current=$(get_last_name "$path")
echo -n "Current="
echo $current
}
と同様にget_last_name
、main
戻り値はありません。の終了コードである終了コードを生成しますecho $current
。get_last_name
この関数は、コマンド置換()内で呼び出すことから始まります。これにより$(...)
、からのすべての標準出力がキャプチャget_last_name
され、文字列として扱われます。
余談
次の違いに注意してください。
current=$(get_last_name "$path")
の値current
をの累積標準出力に設定しますget_last_name
。(特に、出力の改行はスペースに置き換えられますが、空白の処理方法の完全な説明は別の日のトピックです)。これは戻り値とは何の関係もありません。終了コード(クローゼットbash
は「値を返す」必要があります)は単一の整数であることを忘れないでください。
current=get_last_name "$path"
も呼び出さないでしょうget_last_name
。「$path」をコマンドの名前として解釈し、実行しようとします。そのコマンドcurrent
の環境には、文字列値「get_last_name」の変数が含まれます。
重要なのはget_last_name
、変数に割り当てることができるものは何も「返さない」ということです。終了コードがあり、標準出力に書き込むことができます。この$(...)
構成を使用すると、その出力を文字列としてキャプチャし、それを(とりわけ)変数に割り当てることができます。
戻るmain
の値がcurrent
によって生成された出力に設定されるとget_last_name
、最後の2つのecho
ステートメントを実行して、標準出力に再度書き込みます。最初のステートメントは改行なしで「Current=」を書き込むため、次のecho
ステートメントは最初のステートメントと同じ行にテキストを生成します。2つ目は、の値をエコーするだけですcurrent
。
echo
の最後をコメントアウトしたときmain
、実行を停止しませんでしたget_last_name
(すでに実行されていました)。むしろ、端末ではなくcurrent
の出力が配置された変数の内容を出力しなかっただけです。get_last_name