如何使用for循环发现新行?

lol*_*rog 10 shell bash string

在网络的各个地方,我发现:

\015 
\012
\x0a - hex
\n
\r
Run Code Online (Sandbox Code Playgroud)

都作为各种换行符/回车的同义词...

但是在这个小脚本中,当我遇到换行符时我无法识别 - 有人可以告诉我应该在 if 行中检查什么吗?

#!/bin/bash

test="this is a
test"

for a in "$test"; do

        if [[ "$a" == '\012' ]] ; then
                echo "FOUND NEWLINE"
        fi

echo "$a"

done
Run Code Online (Sandbox Code Playgroud)

roz*_*acz 7

如果您直接在for循环下使用字符串,它将对每个单词起作用(这里是一个单词:$test因为它被引用的全部内容),而不是每个字符。您需要使用while循环 withread来逐个解析字母,或者引入一个可以遍历字符串的数字参数。

此外,在使用 时read,您需要确保不会将换行符和空格解释为分隔符并强制一次read读取一个字符。

这是一个工作版本:

#!/bin/bash

test="this is a
test"

printf %s "$test" | while IFS= read -r -N 1 a; do

        if [[ "$a" == $'\n' ]] ; then
                echo "FOUND NEWLINE"
        fi

printf %s "$a"

done
Run Code Online (Sandbox Code Playgroud)

您可以$'\n'用$'\012'或替换$'\x0a',因为它们都表示相同的换行代码。但它与\015or 不同\r- 这代表回车(返回到行首)。在 Linux 系统上,换行符用 表示\n,但例如在 Windows 上,它们用 的序列\r\n代替。这就是为什么如果您有来自 Windows 的文本文件,您也可以通过搜索\r.