shell的for循环

2020-03-05  本文已影响0人  水平号

最佳推荐
While 适合文件逐行处理
For 固定循环
While until不固定循环(需要满足条件退出)

For 循环默认以空格为分隔符
for循环: 将读入的内容以IFS(shell中的环境变量,Internal Field Seperator,字段分隔符)为界分隔,然后将各个分隔开的内容,逐一读入变量line。本质上说,for循环读取的是字段,只不过可以设置IFS为\n这样能够逐行读取。

*while循环:会将每行的内容读入到line变量*

如果希望for处理文件按回车分隔,则需重新定义分隔符
IFS:内部字段分隔符
IFS=$'\n'

for循环的特性

只要有值赋给i,就进行循环,有几个值就循环几次。
但循环体调用或不调用被赋值后的i, 都不会影响循环体里面的执行。
for i in 1 2 3
do
echo "test"
done

示例:新建用户

#!/usr/bin/bash
#判断脚本是否带参数
if [ $# -eq 0 ];then
        echo "usage: `basename $0` file"
        exit 1
fi
#判断文件是否存在
if [ ! -f $1 ];then
        echo "error file"
        exit 2
fi


#for默认使用空格为分隔符,for不太适合处理文件,while循环更适合处理文件
#如果希望for 处理文件按回车分隔,而不是按空格或tab空格
#重新定义分隔符
#IFS内部字段分隔符
#IFS=$'\n'

IFS='
'
##for循环
for line in $(cat $1)
do
        if [ ${#line} -eq 0 ];then                   #for遇到空行会停止运行脚本(认为脚本已处理完成),所以需要判 
                                                                #断空行,遇到空行继续把脚本执行下去。
                contiune
        fi
        user1=`echo "$line" |awk '{print $1}'`
        pass=`echo "$line" |awk '{print $2}'`

        echo $user1 |xargs id &>/dev/null

        if [ $? -eq 0 ];then
                echo "user $user1 already exists"
        else
                useradd $user1
                echo "$pass" |passwd --stdin $user1 &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$user1 is created."
                fi
        fi
done
##另一种 while循环
#IFS=$'\n'                while不需要重置IFS,默认可以按行处理。

 while read line
do
        user1=`echo "$line" |awk '{print $1}'`
        pass=`echo "$line" |awk '{print $2}'`

        echo $user1 |xargs id &>/dev/null
        if [ $? -eq 0 ];then
                echo "user $user1 already exists"
        else
                useradd $user1
                echo "$pass" |passwd --stdin $user1 &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$user1 is created."
                fi
        fi
done < "$1"

上一篇 下一篇

猜你喜欢

热点阅读