次のファイルがあるとしましょう。
hello
world
hello world
このショー
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
出力
tester: hello
tester: world
tester: hello
tester: world
空白を無視して各行を個別に繰り返したいと思いますfor
。つまり、最後の2行を次に置き換える必要があります。
tester: hello world
引用符を使用すると、ファイル全体が一度に割り当てられますfor i in "$(cat $1)";
。i
何を変えるべきですか?
ベストアンサー1
そしてfor
IFS:
#!/bin/bash
IFS=$'\n' # make newlines the only separator
set -f # disable globbing
for i in $(cat < "$1"); do
echo "tester: $i"
done
しかし、空の行はスキップされます。新しいチームIFS 空白文字として、対応するシーケンスは 1 として計算され、先行シーケンスと後続シーケンスは無視されます。zsh
and ksh93
(いいえ)を使用すると、特別な処理なしで改行文字にbash
変更できます。IFS=$'\n\n'
続く改行文字(末尾の空白行を含む)は常にコマンド置換によって削除されます。
またはそしてread
(これ以上cat
):
#!/bin/bash
while IFS= read -r line; do
echo "tester: $line"
done < "$1"
これは空行を保持しますが、改行文字で適切に区切られない場合は、最後の行をスキップします。