unix 通过shell脚本阅读.txt文件在第1行后停止[已关闭]

wgx48brx  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(219)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
四个月前关门了。
Improve this question
我想创建一个可以读取文本文件的shell。
文件users_test.txt如下所示:
标题- * 组:团队:用户 *

Group_A:Team_Red Team_Green:worker_1 worker_2 worker_2 worker_3
Group_B:Team_Blue Team_Black Team_Grey:worker_4 worker_2 worker_5 worker_6

我想遍历上面用冒号分隔的.txt文件。下面是我目前的解决方案。


# !/bin/bash

# set filename

FILENAME="users_test.txt"

# loop through file, each  line is divided into 3 fields separated by a colon (:)

while IFS=':' read -r groups teams users
do 
    echo "group $groups has teams $teams and user $users"

    for team in $teams; do
        echo "hey: "$team
    done

    for group in $groups; do
        echo "hi: "$group
    done

    # Iterate the string variable using for loop
    for user in $users; do
        echo "hello: "$user
    done

done < "$FILENAME"

为什么它在第一次循环迭代后就结束了?

输出:

admin@computer:$ ./setup-test1.sh
group  has teams Team_Red Team_Green and user worker_1 worker_2 worker_2 worker_3
hey: Team_Red
hey: Team_Green
hi: Group_A
hello: worker_1
hello: worker_2
hello: worker_2
hello: worker_3
admin@computer5:$

它看起来工作正常,但它在第一行之后结束,因此B组未打印。
有人能告诉我为什么脚本只读取包含Group_A的第一行,而不读取包含Group_B的第二行吗?

enyaitl3

enyaitl31#

考虑到您的评论,您的文件没有以换行符结尾,0a

$ printf 'foo\n' | xxd
00000000: 666f 6f0a                                foo.

$ printf 'foo' | xxd
00000000: 666f 6f                                  foo

尝试读取此类文件时的区别如下:

$ while IFS= read -r line; do echo "line=$line"; done < <(printf 'foo\n')
line=foo

$ while IFS= read -r line; do echo "line=$line"; done < <(printf 'foo')
$

结尾没有换行符的文件不是有效的文本文件,因此尝试使用任何文本处理工具读取该文件(例如read-注意“标准输入应为文本文件。”)是未定义的行为。不值得浪费时间在任何工具对这样的文件做什么以及为什么做上,如果你想对它们做进一步的文本处理,就不要创建这样的文件。如果你的编辑器创建文件时没有终止换行符,那就换一个新的编辑器,比如vi

相关问题