複数行を使用して変数を割り当てる

複数行を使用して変数を割り当てる

機能があります。

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)

関連情報