1

スクリプトを実装しているときに、次の問題に直面しています。コマンドの複数行の結果を変数に入れると、複数行の文字列の最後の (空の) 行が消えるようです。

この行は「空」ですが、含まれているキャリッジ リターンを失うことはありません (DB に保存され、「\n」文字を含むコード ブロックを人間が読める文字列に連結しているためです... 「\n」の場合、コードのインデントの一部が失われます)

私の問題を説明するコードは次のとおりです。

test="A

B
";
test2=`echo "$test"`;
echo "||$test2||";

これは戻ります

||A

B||

私が期待していた間:

||A

B
||

--> 最後の (空の) 行が消えてしまったので、人間が読めるコードにキャリッジ リターンがありません。

この問題は、複数行の文字列の最後の行が空の場合にのみ発生します...

あなたは知っていますか

  • この最後の行が消えるのはなぜですか?
  • 最後の空の行が複数行の文字列変数に保存されるようにするにはどうすればよいですか?

もちろん、最も簡単な解決策は使用できないことに注意してください

test2="$test";

完全なプロセスはむしろ次のとおりです。

test="^A\n\nB\n^"
test2="`echo "$test" | sed -e 's/\^//g'`";

しかし、私はできる限り問題を単純化しようとしました。

4

2 に答える 2

2

コマンド置換では、常に末尾の改行が削除されます。これは、設計と仕様に従っています。それが望ましくない場合は、出力に固定のシジル文字を追加してトリムし、保持したい改行がシジルの前になるようにすることができます。

test="A

B
"
test_wip=$(printf '%sEND' "$test")
test2=${test_wip%END}
于 2017-09-07T19:48:44.073 に答える
0

echoからの出力を変数に代入することから生じる問題 (たとえば、末尾の \n を削除する)を回避しようとする代わりにksh、この場合、組み込みの文字列処理を使用することを検討してください。

$ test="^A\n\nB\n^"
$ test2="${test//^}"
$ echo "||${test2}||"
||A

B
||
  • //^^: すべての文字を削除
于 2017-09-07T19:39:45.397 に答える