文件a.txt末尾有两个空行
[yaxin@oishi tmp]$ cat -n a.txt
1 jhasdfj
2
3 sdfjalskdf
4
5
Run Code Online (Sandbox Code Playgroud)
我的脚本是:
[yaxin@oishi tmp]$ cat t.sh
#!/bin/sh
a=`cat a.txt`
a_length=`echo "$a" | awk 'END {print NR}'`
echo "$a"
echo $a_length
[yaxin@oishi tmp]$ sh t.sh
jhasdfj
sdfjalskdf
3
Run Code Online (Sandbox Code Playgroud)
打开调试
[yaxin@oishi tmp]$ sh -x t.sh
++ cat a.txt
+ a='jhasdfj
sdfjalskdf'
++ echo 'jhasdfj
sdfjalskdf'
++ awk 'END {print NR}'
+ a_length=3
+ echo 'jhasdfj
sdfjalskdf'
jhasdfj
sdfjalskdf
+ echo 3
3
Run Code Online (Sandbox Code Playgroud)
cat命令窃取文件末尾的空白行.如何解决这个问题.
这里不需要cat命令,直接使用awk,如下所示:
awk 'END {print NR}' a.txt
Run Code Online (Sandbox Code Playgroud)
您的问题是将 cat 的输出存储在 shell 变量中。即使这样也会给出正确的输出(尽管是 UUOC 的情况):
cat a.txt | awk 'END {print NR}'
Run Code Online (Sandbox Code Playgroud)
更新:当您尝试执行此操作时:
a=`cat a.txt`
Run Code Online (Sandbox Code Playgroud)
要不然:
a=$(cat a.txt)
Run Code Online (Sandbox Code Playgroud)
陷阱是进程替换 ie 命令在反向引号内,就像您所拥有的或在 $()
尾随换行符的条带中一样中一样。
您可以使用此技巧来获取存储在 shell 变量中的尾随换行符:
a=`cat a.txt; echo ';'`
a="${a%;}"
Run Code Online (Sandbox Code Playgroud)
测试变量值:
echo "$a"
printf "%q" "$a"
Run Code Online (Sandbox Code Playgroud)
然后输出也会显示换行符:
jhasdfj
sdfjalskdf
$'jhasdfj\n\nsdfjalskdf\n\n\n'
Run Code Online (Sandbox Code Playgroud)