注册 登录
编程论坛 Linux教室

请教一个shell问题?

冬冬123 发布于 2021-06-10 16:40, 4130 次点击
linux版本:
[root@localhost aw]# uname -a
Linux localhost.localdomain 3.10.0-1160.25.1.el7.x86_64 #1 SMP Wed Apr 28 21:49:45 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
用作测试的目录下的文件
[root@localhost aw]# ls -lS --time-style=long-iso
总用量 24
-rwxr-xr-x 1 root root 286 2021-06-10 15:56 remove.sh
-rw-r--r-- 1 root root   9 2021-06-10 15:55 arg1
-rw-r--r-- 1 root root   9 2021-06-10 15:55 arg2
-rw-r--r-- 1 root root   9 2021-06-10 15:55 arg3
-rw-r--r-- 1 root root   9 2021-06-10 15:56 arg4
-rw-r--r-- 1 root root   9 2021-06-10 16:29 arg5

代码一
#!/bin/bash
ls -lS --time-style=long-iso | awk 'BEGIN {
 getline; getline;
 name1=$8; size=$5
}
{
 name2=$8;
 if (size==$5)
 {
 "md5sum "name1 | getline; csum1=$1;
 "md5sum "name2 | getline; csum2=$1;
 if ( csum1==csum2 ) { print name1; print name2 }
 };
 size=$5; name1=name2;
}'
输出结果:
[root@localhost aw]# ./remove.sh
arg1
arg2
arg3
arg4

代码二
#!/bin/bash
ls -lS --time-style=long-iso | awk 'BEGIN {
 getline; getline;
 name1=$8; size=$5
}
{
 name2=$8;
 if (size==$5)
 { print name1; print name2 };
 size=$5; name1=name2;
}'
输出结果:
[root@localhost aw]# ./remove1.sh
arg1
arg2
arg2
arg3
arg3
arg4
arg4
arg5

请问代码一代码二输出的结果为何不同?
1 回复
#2
冬冬1232021-06-23 16:44
经验证,发现事故原因出现在:
"md5sum "name1 | getline; csum1=$1;
 "md5sum "name2 | getline; csum2=$1;

当getline;执行后,外部的$5将改变为空值(即ls -lS --time-style=long-iso | awk中当前行的$5),影响最终输出的正确性。
应当将此句改为"md5sum "name1 | getline temp; csum1=$1; 当getline将获取的内容传递给指定变量后,就不会影响awk的$n等内部变量了。
1