次の内容のテキスト ファイル 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 3
のa b c d
バリアントは、その動作を示しています。
次に、変数の2つのバリエーションを試しますx
。それなし引用符は、、、の"test"
4つの単語があることを示しています。引用符を追加すると、"1"
"test"
"2"
1つ一つの単語"test 1\ntest 2"
。