设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 1019|回复: 0

[经验分享] bash脚本编程:for循环

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-3-4 08:41:35 | 显示全部楼层 |阅读模式
顺序执行:默认法则,逐条执行各语句
选择执行:分支,条件判断,符合条件的分支予以执行;
循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环。

程序代码:语句和表达式组成

控制语句:

bash循环控制语句:for  while  until

for循环:
for var_Name in 列表; do
语句1
语句2
...
done

循环添加指定用户
for userName in gentoo mandriva debian; do
useradd $userName
done

语法错误检测:
# bash -n 脚本文件

写一个脚本:添加10个用户,user101-user110

列表的生成方法:
生成数字序列:{start..end}、seq [start] [step] end

#!/bin/bash
for userName in `seq 101 110`; do
useradd user$userName
echo "Add user$userName successfully."
done

练习:写一个脚本,用file命令显示/var/log目录下每个文件的内容类型;
提示:列表生成的方法为/var/log/*

#!/bin/bash
#
dirName=/var/log
for fileName in $dirName/*; do
file $fileName
done

bash -n /path/to/script


循环:退出条件, 元素列表遍历结束

for varName in LIST
do
statement1
...
done


练习:写一个脚本,
1、创建/tmp/scripttest目录,用变量保存目录名;
2、在目录里创建测试文件tfile1-tfile20;
3、创建用户testuser1和testuser2;
4、将tfile1-tfile10的属主和属组改为testuser1;
5、将tfile11-tfile20的属主和属组改为testuser2;

#!/bin/bash
dirName=/tmp/scripttest

mkdir $dirName
for fileNo in {1..20}; do
touch $dirName/tfile$fileNo
echo "Create $dirName/tfile$fileNo finished"
done

useradd testuser1
useradd testuser2

for fileNo in {1..10}; do
chown testuser1:testuser1 $dirName/tfile$fileNo
done

for fileNo in {11..20}; do
chown testuser2:testuser2 $dirName/tfile$fileNo
done


#!/bin/bash
dirName=/tmp/scripttest

useradd testuser1
useradd testuser2

mkdir $dirName
for fileNo in {1..10};do
touch $dirName/tfile$fileNo
chown testuser1:testuser1 $dirName/tfile$fileNo
done


练习:写一个脚本,用for循环实现
显示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行;

#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
wc -l $fileName
done

#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
lineCount=`wc -l $fileName | cut -d' ' -f1`
echo "$fileName: $lineCount lines."
done

#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines."
done

练习:写一个脚本
将上一题中三个文件的复制到/tmp目录中;
用for循环实现,分别将每个文件的最近一次的修改时间改为2011年9月15号13点27分;
#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
cp $fileName /tmp
baseName=`basename $fileName`
touch -m -t 201109151327 /tmp/$baseName
done


练习:写一个脚本
显示/etc/passwd中第3、7和11个用户的用户名和ID号;
#!/bin/bash
#
for lineNo in 3 7 11; do
userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3`
echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`"
done

练习:计算100以内所有正整数之和;
#!/bin/bash
#
declare -i sum=0
for i in {1..100}; do
  let sum=$sum+$i
done

echo "The sum is: $sum."

练习:求200以内所有3的整数倍的正整数的和;
#!/bin/bash
declare -i sum=0
for i in {1..200}; do
if [ $[$i%3] -eq 0 ]; then
let sum+=$i
fi
done

echo "The sum is: $sum."

知识点:bash的单步执行:
bash -x /path/to/script



练习:分别计算100以内所有偶数之和和奇数之和;
#!/bin/bash
declare -i oddSum=0,evenSum=0

for i in `seq 1 2 100`; do
  oddSum=$[$oddSum+$i]
done

for j in `seq 2 2 100`; do
evenSum=$[$evenSum+$j]
done

echo "The Even Sum is: $evenSum, the odd sum is: $oddSum"

练习:计算当前系统所有用户的ID之和;

#!/bin/bash
declare -i uidSum=0
for i in `cut -d: -f3 /etc/passwd`; do
uidSum=$[$uidSum+$i]
done

echo "The UIDSum is: $uidSum."

练习:计算/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/issue三个文件的字符数之和;
#!/bin/bash
#
declare -i bytesCount=0
for file in /etc/rc.d/rc.sysinit /etc/init.d/functions /etc/issue; do
let bytesCount=$bytesCount+`wc -c $file | cut -d' ' -f1`
done

echo $bytesCount

练习:新建用户tmpuser1-tmpuser10,并计算他们的id之和;
#!/bin/bash
#
declare -i uidSum=0
for i in {1..10}; do
useradd tmpuser$i
let uidSum=$uidSum+`id -u tmpuser$i`
done

练习:写一脚本,实现如下功能:
        1、让用户通过键盘输入一个用户名,如果用户不存在就退出;
        2、如果其UID等于其GID,就说它是个"good guy"
        3、否则,就说它是个“bad guy”;

#!/bin/bash
# exit 6 --
read -t 10 -p "Enter a username: " userName
if ! id $userName &> /dev/null; then
        echo "$userName not exist."
        exit 6
fi

if [ `id -u $userName` -eq `id -g $userName` ]; then
        echo "Good guy."
else
        echo "Bad guy."
fi

扩展:判断当前系统上的所有用户是Good guy还是Bad guy.

for userName in `cut -d: -f1 /etc/passwd`; do
       
done


练习:写一个脚本,实现如下功能:
        1、添加10个用户stu1-stu10;但要先判断用户是否存在;
        2、如果存在,就用红色显示其已经存在
        3、否则,就添加此用户;并绿色显示;
        4、最后显示一共添加了几个用户;

#!/bin/bash
#
declare -i userCount=0
for i in {1..10}; do
        if id stu$i &> /dev/null; then
                echo -e "\033[31mstu$i\033[0m exists."
        else
                useradd stu$i && echo -e "add \033[32mstu$i\033[0m finished."
                let userCount++
        fi
done

echo "Add $userCount users."

for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环;
总结:生成列表的方式
1、直接给出列表;
2、使用文件名通配的机制生成列表
3、可以使用{}或seq命令生成数字序列  $lineCount  `seq 1 $lineCount`  {1..$lineCount}
4、使用命令生成


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42980-1-1.html 上篇帖子: bash脚本编程:while循环和until循环 下篇帖子: python 之颜色输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表