Bash オプションを使用すると、コマンド置換で末尾の改行が維持されます。

Bash オプションを使用すると、コマンド置換で末尾の改行が維持されます。

bashコマンドの交換によって末尾の改行文字が削除されるのを防ぐためのオプションが提供されていれば幸いです。あなたはいますか?そうでなければ、POSIXのようなシェルはありますかbash?標準(POSIXのようです)shコードを実行するシェルはありますか?そのようなオプションがあるか、改行文字を削除しない特別なコマンド代替構文があるかもしれません(後者がより良い)。 )?

ベストアンサー1

(私が知っている限り)これを直接実行するオプションはありませんが、コマンドの置き換えに改行ではなく保護文字を追加してから削除して偽にすることができます。

var="$(somecommand; echo .)"  # Add a "." (and one newline that command
                              # substitution will remove) *after* the
                              # newline(s) we want to protect

var="${var%.}"  # Remove the "." from the end

との終了状態は両方とも状態が設定されているsomecommandため(通常0)、プロセスで失われます。最後まで保存する必要がある場合は、ジャグリングを追加する必要があります(Kusalananda提供)。echo .var=${var%.}

var="$(somecommand; err=$?; echo .; exit "$err")"  # Make the subshell
                                                   # exit with somecommand's
                                                   # status
commandstatus=$?    # Preserve the exit status of the subshell
var="${var%.}"
# You can now test $commandstatus to see if the command succeeded

errと変数はすべてcommandstatusコマンドの終了状態を格納しますが、errによって生成されたサブシェルにのみ存在し、親$( )シェルcommandstatusにのみ存在するため、重複しません。両方に同じ名前を使用できますが、これは混乱を引き起こす可能性があります。

さて、「。」後ろに状態を保存する必要がない場合は、切り捨ててこのcommandstatus部分をスキップできます。

if var="$(somecommand; err=$?; echo .; exit "$err")"; then
    # somecommand succeeded; proceed with processing
    var="${var%.}"
    dosomethingwith "$var"
else
    echo "somecommand failed with exit status $?" >&2
fi
ロケールに応じて「。」代わりに、どの文字も使用できません。 POSIXは「。」エンコーディングが他の文字エンコーディングで見つからないことを保証しますが、すべての場合に当てはまるわけではありません。たとえば、実際には「x」のエンコーディングは、BIG5またはGB18030エンコーディングの多くの文字のエンコーディングの終わりにあるため、「。」代わりに「x」を追加すると、「x」は次のように終了できます。出力の終わりに現れる他のバイトの組み合わせは新しい文字を形成し、 "${var%x}" は "x" を削除できません。

おすすめ記事