使用while循環一次讀取文件的一行,直到文件尾部格式如下:
while read line; do \\ line 爲一個變量,表示讀取到一行的字符 循環體 done < /path/to/somefile
使用read由標準輸入讀取數據,放入變量line中,如果讀到的數據非空,就進入循環。
示例:
取得/etc/passwd的用戶名及shell
#!/bin/bash # IFS=':' ## 改變字段分隔符 while read f1 f2 f3 f4 f5 f6 f7 ## 將讀取的各行帳號放入f1-9的變量中 do echo "userName: $f1 ;userShell: $f7" ## 輸出變量 done < /etc/passwd
或可以通過管道傳給{}的指令組如下所示
#!/bin/bash # IFS=':' ## 改變字段分隔符 cat /etc/passwd | { while read f1 f2 f3 f4 f5 f6 f7 ## 將讀取的各行帳號放入f1-9的變量中 do echo "userName: $f1 ;userShell: $f7" ## 輸出變量 done }
練習:
1、取出當前系統上,默認shell爲bash的用戶
#!/bin/bash # while read line;do if [[ `echo $line | cut -d: -f7` =~ bash$ ]];then echo $line | cut -d: -f1,7 fi done < /etc/passwd
或
#!/bin/bash # while read line;do [[ `echo $line | cut -d: -f7` =~ bash$ ]] && echo $line | cut -d: -f1,7 done < /etc/passwd
2、顯示所有其ID號爲偶數的用戶
#!/bin/bash # while read line;do if [[ $[`echo $line | cut -d: -f3`%2] -eq 0 ]];then echo $line | cut -d: -f1,3 fi done < /etc/passwd
3、顯示/etc/rc.d/rc.sysinit文件中,其總字符個數大於30的行
#!/bin/bash # while read line;do if [ `echo $line | wc -c` -gt 30 ];then echo "`echo $line | wc -c`:$line" fi done < /etc/rc.d/rc.sysinit
4、顯示所有其UID和GID均爲偶數的用戶;
#!/bin/bash # while read line;do if [ $[`echo $line | cut -d: -f3`%2] -eq 0 ] && [ $[`echo $line | cut -d: -f4`%2] -eq 0 ];then echo $line | cut -d: -f1,3-4 fi done < /etc/passwd
或
#!/bin/bash # while read line;do userID=`echo $line | cut -d: -f3` groupID=`echo $line| cut -d: -f4` userName=`echo $line| cut -d: -f1` [ $[$userID%2] -eq 0 ] && [ $[$groupID%2] -eq 0 ] && echo "$userName : $userID : $groupID" done < /etc/passwd
5、顯示/etc/rc.d/rc.sysinit文件中,其總字符個數大於30且非以“#”開頭的行;
#!/bin/bash # while read line;do if [ `echo $line | wc -c` -gt 30 ] && echo $line | grep "^#" ;then echo $line fi done < /etc/rc.d/rc.sysinit