機能があります。
f(){
echo 777
}
そして、関数の「戻り値」を割り当てる変数です。
x=$(f)
とても簡潔です!しかし、私の実際のコードでは、変数名と関数名がかなり長く、関数も位置パラメータを使用するため、上記の簡潔な行は非常に長くなります。私は仕事をきれいに保つのが好きなので、上記のコードを2行に分割したいと思います。
x=\
$(f)
それでも動作します!しかし、きれいに保つことは、インデントを尊重することを意味するので、これは次のような結果を提供します。
if foo
x=\
$(f)
fi
空白のためもう動作しません!良い解決策がありますか?
答え1
なぜ複雑で読みにくい構造なのか?中間操作、空の文字列を構成する素晴らしい方法、参照の微妙さ、または他の認知負荷が不要な完全に自然な表現方法があります。
if foo; then
x=$(
a_very_long_command_name --option1='argument 1 is long' \
--option2='argument 2 is long as well'
)
fi
答え2
$_
最後のパラメータに設定された値を保存できます。
if foo; then
: "$(f)"
x=$_
fi
あるいは、サブシェルを使用してインデントを食べることもできます。
if foo; then
x=$(
)$(f)
fi
答え3
here-docsを使用することが許可されている場合、次のスタイルはうまく機能します。 here-doc 文字列で先行引用符を使用すると、-
コードでタブ文字を使用できます。ただ。
それはまるで
if true; then
read -d '' -r x <<-EOF
$(f)
EOF
fi
ただし、Stack Exchangeはタブを空白に置き換えるため、上記のコードをコピーして貼り付けるのはうまくいきません。Tabhere-docで始まる行とhere-docで終わる行の文字を慎重に入力する必要があります。私のvim
設定には8つのスペースにマップされたタブがあります。もっときれいにしたい場合は、間隔ルールを変更して、vim
以下のようにタブ間の間隔を4つのスペースに設定してください。:set tabstop=4
Tab以下を使用して、私のスクリプトの形式を表示できます。sed
$ sed -n l script.sh
#!/usr/bin/env bash$
$
$
f(){$
echo 777$
}$
$
if true; then$
\tread -d '' -r x <<-PERSON$
\t$(f)$
\tPERSON$
fi$
$
echo $x$
\t
上記のhere-doc文字列の文字を参照してください。スクリプトが上記と異なる場合は、予期しないEOF
エラーが発生することがわかります。
答え4
なぜ等号で行を分けるのですか?別の変数に関数のパラメータを設定できます。
unset args
args+='arg1 '
args+='arg2 '
args+='arg3 '
x=$(f $args)