![如何使用 for 循环发现新行?](https://linux22.com/image/19755/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20for%20%E5%BE%AA%E7%8E%AF%E5%8F%91%E7%8E%B0%E6%96%B0%E8%A1%8C%EF%BC%9F.png)
在网络上的各个地方我发现:
\015
\012
\x0a - hex
\n
\r
全部作为各种换行符/回车符的同义词...
但在这个小脚本中,当我遇到换行符时,我无法识别 - 有人可以告诉我应该在 if 行中检查什么吗?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
答案1
如果您直接在for
循环下使用字符串,它将针对每个单词工作(此处为一单词:自引用以来的全部内容$test
),而不是每个字符。您需要使用while
循环来read
逐个字母地解析,或者引入一个可以迭代字符串的数字参数。
此外,使用 时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
您可以替换$'\n'
为$'\012'
或$'\x0a'
,因为它们都代表相同的换行代码。但它与\015
or不同\r
- 这代表回车(返回到行首)。在 Linux 系统上,换行符使用 表示\n
,但在 Windows 上,它们由一系列 代替 表示\r\n
。这就是为什么如果您有来自 Windows 的文本文件,您也可以通过搜索\r
.
答案2
您可以在 bash 中轻松检查变量中的换行符:
[[ $var = *$'\n'* ]]
我觉得用起来比较方便:
declare -r EOL=$'\n' TAB=$'\t' # at top of script
..
if [[ $var = *$EOL* ]]; then # to test (no field-splitting in [[ )
答案3
我建议使用tr
然后test
:
if [ -n "$(tr -cd '\n\r' < datafile)" ]; then
echo "NEWLINE FOUND"
fi
删除tr -cd
除换行符/回车符之外的所有内容。如果文件中有换行符,则测试将返回 true 的输出-n
。