1. ホーム
  2. bash

[解決済み] ファイルの内容を改行付きでunix変数に入れる

2022-05-15 11:49:11

質問

以下の内容のテキストファイルtest.txtがあります。

text1
text2 

そして、ファイルの内容をUNIX変数に代入したいのですが、こうすると。

testvar=$(cat test.txt)
echo $testvar

という結果になります。

text1 text2

の代わりに

text1
text2 

どなたか解決策を提案していただけませんか?

どのように解決するのですか?

課題は ではなく は改行文字を削除するのではなく、実際には echo がそうしているのです。改行文字を維持するには、単に文字列を引用符で囲む必要があります。

echo "$testvar"

これで望みの結果が得られます。デモは次のトランスクリプトを参照してください。

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2


理由 は、改行が空白に置き換えられる理由ではなく を完全に と関係するものではありません。 echo コマンドとは関係なく、むしろいろいろなものが組み合わさっているのです。

コマンドラインが与えられると bash のドキュメントに従って 単語に分割します。 IFS 変数のドキュメントに従って単語に分割します。

IFSです。 展開後の単語分割に使われる Internal Field Separator ... デフォルト値は <space><tab><newline> .

これは、デフォルトで、これら3つの文字のいずれかを使用して、コマンドを個々の単語に分割できることを指定します。その後、単語のセパレータはなくなり、残るのは単語のリストだけです。

これを echo のドキュメント (a bash の内部コマンド)を見てみると、なぜスペースが出力されるのかがわかると思います。

echo [-neE] [arg ...]: 空白で区切られた引数を出力し、その後に改行する。

を使うときは echo "$x" を使うと、強制的に全体の x 変数が シングル に従って bash に従って、それは分割されません。でわかると思います。

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

ここで count 関数は単に与えられた引数の数を出力します。また 1 2 3a b c d バリアントがそれを実際に示しています。

次に、2 つのバリエーションで試してみます。 x 変数で試してみます。ひとつは がなければ の引用は、4つの単語があることを示しています。 "test" , "1" , "test""2" . 引用符を追加すると 1 という単一の単語 "test 1\ntest 2" .