https://www.jianshu.com/p/e549b9b8d744
最佳推荐
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"