我有一个包含大约 800 行的文件。所有行都包含 1 个 * 字符。
我需要循环遍历文件中的行,因此我使用了以下简单的 for 循环
for i in $(cat file_path); do echo $i; done
不幸的是它没有起作用。
当我尝试使用其他文件但文件中的行不包含 * 字符时,循环工作正常。
我该如何解决这个问题?
答案1
您的代码存在一些问题:
- 离开不带引号的变量和命令替换
- 使用回声任意变量
您可以使用while
循环来修复它们:
while IFS= read -r line <&3; do
{ printf '%s\n' "$line"; } 3<&-
done 3< file
[ -z "$line" ] || printf %s "$line"
需要注意的是使用 while 循环处理文本文件被认为是不好的做法在 POSIX shell 中。
答案2
您可以使用while
:
while read line; do echo "$line"; done < test.txt
或定义单独的字符IFS
:
SAVEIFS=$IFS; IFS="\n"; for i in $(cat test.txt); do echo "$i"; done; IFS=$SAVEIFS
答案3
您必须使用以下格式:
#!/bin/bash
SAVEIFS=$IFS
while IFS= read -r line <&3
do
echo "$line"
done 3< myfile.txt
IFS=$SAVEIFS
测试是:
root@debian:/home/mohsen/test/shell# ./linebylibe.sh
ff
dd
gg
tt
tt
ww
ee
我的 myfile.txt 是:
root@debian:/home/mohsen/test/shell# cat myfile.txt
ff
dd
gg
tt
tt
ww
ee