需求描述
有一个文件list,每行有一个数字,给定一个数字,查询在文件的第几行(行数从0开始),查询数字一定在list中
1 2 3 4 5 6 7 |
cat ./list 5 4 3 2 1 |
错误的shell代码
test1.sh,输出0错误 :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash i=0 query=2 cat ./list | while read line do if [ $line == $query ]; then break fi (( i=i+1 )) done echo $i |
正确的shell代码
test2.sh,输出3正确 :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash i=0 query=2 while read line do if [ $line == $query ]; then break fi (( i=i+1 )) done <./list echo $i |
分析
为了方便观察,在while中加入sleep 10
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$sh test1.sh & $ps -o pid,ppid,gid,cmd PID PPID GID CMD 1209 1190 1000 bash 26469 1209 1000 sh test.sh 26475 26469 1000 sleep 10 26478 1209 1000 ps -o pid,ppid,gid,cmd $kill %1 $sh test2.sh & $ps -o pid,ppid,gid,cmd PID PPID GID CMD 1209 1190 1000 bash 26611 1209 1000 sh test.sh 26613 26611 1000 sh test.sh 26614 26613 1000 sleep 10 26615 1209 1000 ps -o pid,ppid,gid,cmd |
可以看出,cat ./list 通过管道传给while循环,会创建一个进程pid=26613,当循环结束,进程也结束了,i在while循环中,相当于重新定义的局部变量,不影响同名的全局变量