2017-04-03 10 views
0

私は別のファイルに入力ファイルからのすべての行をコピーしようとしている:名前付きファイルからの読み取り方法

#!/bin/bash 
in=$1 
file="current_line.txt" 
let count=0 
echo $count 
while read LINE 
do 
     ((count++)) 
     echo $count 
     echo $LINE > $file 
done 

なぜreadコマンドは、私は、スクリプトへの引数として与えたファイルから入力を取得していませんか?

+1

どこから読んでいますか? – grail

+1

あなたは '>'リダイレクトを使用しています。これは '$ LINE'という内容の新しいファイル' current_file.txt'を作成します。あなたのファイルに行を蓄積したい場合は、 '>'の代わりに '' ''を使います。 –

+0

まあ、 'LINEを読んでいる間に' LINEを使うと、LINEは "in"の行を読みません。どこにあるのかは、テキストが入っているファイルの名前です –

答えて

0
#!/bin/bash 

in=$1 
file="current_line.txt" 
count=0 
echo $count 

while read -r LINE 
do 
     echo $LINE >> $file 
     count=$((count + 1)) 
     echo $count 


done < "$in" 

上記の方法で入力ファイルの最後に入力します。

+0

@ LRobert私は自分のシステム上で動作していることを確認しました。あなたは何か質問がある場合は私に教えてください。 –

0

in変数を入力ファイルを指すように設定していますが、何もしていません。 readビルトインは標準入力から読み込みます。これは継承されるため、いつでもリダイレクトされていなければ、呼び出すターミナル(または端末エミュレータ)シェルセッションに戻ります。

あなたは後から標準入力を復元したい場合は、あなたがそれを呼び出すよう、または

exec <"$in" 
while read LINE 
do 
    # ... 
done 

によって、あなたは未使用の記述にそれを保存する必要があります(ただし好むだろうどちらか、スクリプトの標準入力をリダイレクトすることができます次の代替、それは簡単ですと):

exec 3<&0 <"$in" 
while read LINE 
do 
    # ... 
done 
exec <&3 # to restore input 

また、あなたが$inから読み取るだけwhileループをリダイレクトすることができます

while read LINE 
do 
    # ... 
done <"$in" 

さらなる代替は、あなたの入力にファイルディスクリプタを捧げ、そしてあなたのreadコマンドのためにそれを使用するread -uを使用することです:あなたはinに割り当てるときはさておき、注意するよう

exec 3<"$in" 
while read -u 3 LINE 
do 
    # ... 
done <"$in" 

exec 3<&- # to close the file neatly 

各ということも

in="$1" 

注:制御されていないユーザー入力から来た$1の値を引用しますは、$fileを上書きするので、スクリプトの終了時に入力の最後の行だけが表示されます。 whileループ全体の出力を、リダイレクトと同じ方法でリダイレクトすることを検討してください。例:

while read LINE 
do 
    # ... 
    echo "$LINE" # Note the quoting (unless you actually intend to collapse whitespace) 
done <"$in" >"$file" # and here! 
+0

詳細を説明してくれてありがとう:) –

関連する問題