回答:
割り当てによって改行文字が削除されることはありません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:拡張後の単語分割に使用される内部フィールド区切り文字...デフォルト値は
<space><tab><newline>
です。
これは、デフォルトで、これらの3つの文字のいずれかを使用してコマンドを個々の単語に分割できることを示しています。その後、単語の区切りはなくなり、残っているのは単語のリストだけです。
これをecho
ドキュメント(bash
内部コマンド)と組み合わせると、スペースが出力される理由がわかります。
echo [-neE] [arg ...]:スペースで区切られたargsに続いて改行を出力します。
を使用すると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
変異体は、アクションでそれを示しています。
次に、x
変数の2つのバリエーションを試してみます。1 なしの 4つのワードがあることを引用符ショー、"test"
、"1"
、"test"
と"2"
。引用符を追加すると、1つの単語になり"test 1\ntest 2"
ます。
これは、改行を含むIFS(Internal Field Separator)変数が原因です。
$ cat xx1
1
2
$ A=`cat xx1`
$ echo $A
1 2
$ echo "|$IFS|"
|
|
回避策は、一時的に改行を含まないようにIFSをリセットすることです:
$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK
IFSのこの恐ろしい変更を元に戻すには:
IFS=$IFSBAK
echo "$(IFS=''; cat text.txt)"
Bash -ge 4には、標準入力から行を配列変数に読み込むためのmapfileが組み込まれています。
help mapfile
mapfile < file.txt lines
printf "%s" "${lines[@]}"
mapfile -t < file.txt lines # strip trailing newlines
printf "%s\n" "${lines[@]}"
以下も参照してください。
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
envdir
ユーティリティは、これを行うための簡単な方法を提供します。 envdir
ファイルを使用して環境変数を表します。ファイル名はenv var名にマッピングされ、ファイルの内容はenv var値にマッピングされます。ファイルの内容に改行が含まれている場合は、env varも含まれます。