改行は変数内にあります。LS=$(ls -1)変数LSをの出力に設定しますls -1(これによりls、出力が端末に送られる場合を除いて、と同じ出力が生成されます)。
問題は、値を出力するときに改行を削除することです。シェルスクリプトで$LSは、「変数の値」を意味するのではなく、「の値をLS取り、LSそれを単語に分割しIFS、各単語をグロブパターンとして解釈する」ことを意味します。の値を取得するにはLS、を記述"$LS"するか、より一般的に$LSは二重引用符で囲む必要があります。
echo "$LS"値を出力しLS、バックスラッシュ文字を解釈し、で始まるいくつかの値を除いて、いくつかのシェルを除き、-。
printf "$LS"LSパーセントまたはバックスラッシュ文字を含まず、(ほとんどの実装では)で始まらない限り、の値を出力します-。
の値をLS正確に出力するには、を使用しますprintf %s "$LS"。最後に改行が必要な場合は、を使用しますprintf '%s\n' "$LS"。
注$(ls)一般的に、ではない、現在のディレクトリ内のファイルのリスト。これは、ファイル名を十分に使いこなしていない場合にのみ機能します。ファイル名(ドットファイルを除く)のリストを取得するには、ワイルドカードを使用する必要があります*。結果は文字列ではなく文字列のリストなので、文字列変数に割り当てることはできません。files=(*)それらをサポートするシェル(ksh93、bash、zsh)で配列変数を使用できます。
詳細については、「シェルスクリプトが空白やその他の特殊文字で詰まるのはなぜですか?」を参照してください。
printf "%s\n" $LSそれを行います。