次の.txtファイルがあります。
Marco
Paolo
Antonio
1行ずつ読みたいので、1行ごとに変数に.txt行の値を割り当てます。私の変数を$name
とすると、フローは次のようになります。
$name
= "Marco"を割り当ててください$name
でいくつかのタスクを実行してください$name
= "Paolo"を割り当ててください次のように(rr.sh
として保存)、引数として渡されたファイルを1行ずつ読み込みます。
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
説明:
IFS=''
(またはIFS=
)は、前後の空白が削除されないようにします。-r
はバックスラッシュエスケープが解釈されるのを防ぎます。|| [[ -n $line ]]
で終わっていない場合、\n
は最後の行が無視されないようにします(read
はEOFに遭遇するとゼロ以外の終了コードを返すため)。次のようにスクリプトを実行してください。
chmod +x rr.sh
./rr.sh filename.txt
…….
read
には-r
フラグを使用することをお勧めします。
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
私はman 1 read
から引用しています。
もう一つのことは、引数としてファイル名を取ることです。
これが更新されたコードです。
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"
次のBashテンプレートを使用すると、ファイルから一度に1つの値を読み取って処理することができます。
while read name; do
# Do what you want to $name
done < filename
#! /bin/bash
cat filename | while read LINE; do
echo $LINE
done
多くの人が過度に最適化されたソリューションを投稿しています。私はそれが間違っているとは思いませんが、誰もがこれがどのように機能しているかを容易に理解できるようにするためには、あまり最適化されていないソリューションが望ましいと謙虚に思います。これが私の提案です:
#!/bin/bash
#
# This program reads lines from a file.
#
end_of_file=0
while [[ $end_of_file == 0 ]]; do
read -r line
# the last exit status is the
# flag of the end of file
end_of_file=$?
echo $line
done < "$1"
つかいます:
filename=$1
IFS=$'\n'
for next in `cat $filename`; do
echo "$next read from $filename"
done
exit 0
あなたがIFS
を異なって設定したならば、あなたは奇妙な結果を得るでしょう。
入力ファイルとユーザー入力の両方(またはstdinの他のもの)を処理する必要がある場合は、次の解決策を使用してください。
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
承認された回答 および bash-hackersリダイレクトのチュートリアル に基づく。
ここでは、スクリプト引数として渡されたファイルのファイル記述子3を開き、この記述子を入力として使用するようにread
に指示します(-u 3
)。したがって、デフォルトの入力記述子(0)を端末または別の入力ソースに添付したままにして、ユーザー入力を読み取ることができるようにします。
適切なエラー処理のために:
#!/bin/bash
set -Ee
trap "echo error" EXIT
test -e ${FILENAME} || exit
while read -r line
do
echo ${line}
done < ${FILENAME}
BashでIFS(内部フィールド区切り)ツールを使用し、行をトークンに分割するために使用する文字を定義します。デフォルトでは、<tab>/<space>/<newLine>
ステップ1:ファイルデータをロードし、リストに挿入します。
# declaring array list and index iterator
declare -a array=()
i=0
# reading file in row mode, insert each line into array
while IFS= read -r line; do
array[i]=$line
let "i++"
# reading from file path
done < "<yourFullFilePath>"
ステップ2:出力を繰り返して出力します:
for line in "${array[@]}"
do
echo "$line"
done
配列内のエコー固有のインデックス:配列内の変数へのアクセス:
echo "${array[0]}"
以下はファイルの内容を表示するだけです。
cat $Path/FileName.txt
while read line;
do
echo $line
done