2016-09-23 2 views
0

ファイルのすべての行を読み込み、文字列に連結しようとしています。広範囲にグーグルの後、ここで私が持っているものです。Bashの読み込みファイルとビルド文字列に関する問題

#!/bin/bash 

filename='file.txt' 
files='' 

while read p; do 
    files="$files $p" 
done < $filename 

echo $files 

問題は、ファイル変数は毎回上書き得るように見えるようだということです。それを追加するべきではありませんか?

例file.txtなど:

test1 
test2 
test3 

出力は次のとおりです。

test2 

(あるとして、私はintentiallyこの投稿ことに注意してください - 出力の前の単語test2にスペースがある)

+1

'test1 test2 test3'を取得できません。 – heemayl

+0

'files = $(cat $ filename)'を使用してください。 –

+0

@heemayl Hmm。私はGit Bashを使ってWindows上にいる。私が実行しているものを正確に投稿しました –

答えて

3

あなたの入力ファイルは、DOSの行末を持ち、改行で終了しません。つまり、ファイルの値は実際にはtest1\r test2\rです。 pからtest3に設定されたreadへの最後の呼び出しで、最終改行文字が見つからないために終了ステータスが1になるため、test3は追加されません。

端末は、カーソルを行の先頭に移動する命令として扱います。したがって、末尾に\rが続くと、その行に以前に書き込まれたものはすべて上書きされます。

正しいことは、テキストファイルのPOSIX標準に準拠するように入力ファイルを修正することです。最後の行を含むすべての行は、単一の\n文字で終了します。

+0

また、DOSフォーマットを扱うためにループをハックすることもできます。while while IFS = $ '\ r' read p || [[-n "$ p"]];します。 IFS設定は末尾のキャリッジリターンを調整し、 '||'句は最後の(正しく終端されていない)ラインのループを継続します。 –

1

問題は、file.txtに改行があることです。

あなたの最後の行を変更し、これをチェックするには:

は$ファイルをエコー| cat -v

関連する問題