ファイルの内容を改行付きで Unix 変数に入力する 質問する

ファイルの内容を改行付きで Unix 変数に入力する 質問する

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

text1
text2 

そして、ファイルの内容を UNIX 変数に割り当てたいのですが、次のようにすると、

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

結果は次のとおりです。

text1 text2

の代わりに

text1
text2 

誰かこれに対する解決策を提案してくれませんか?

ベストアンサー1

この課題はない改行文字を削除するには、実際には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

IF: いいえ拡張後の単語分割に使用される内部フィールド区切り文字...デフォルト値は です<space><tab><newline>

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

echoこれをドキュメント (内部コマンド)と組み合わせるbashと、スペースが出力される理由がわかります。

echo [-neE] [引数 ...]:引数をスペースで区切って出力し、その後に改行を続けます。

を使用すると、変数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それなし引用符は、、、の"test"4つの単語があることを示しています。引用符を追加すると、"1""test""2"1つ一つの単語"test 1\ntest 2"

おすすめ記事