bash脚本编程:for循环

顺序执行:默认法则,逐条执行各语句

选择执行:分支,条件判断,符合条件的分支予以执行;

循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环。

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

控制语句:

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、使用命令生成

时间: 2024-07-28 12:26:48

bash脚本编程:for循环的相关文章

2018-3-26Linux系统管理(14)bash脚本编程之循环控制语句

我们在上个章节中讲到了如何使用yum来实现所谓的程序包管理,对于yum而言,它只是rpm包的一个前段管理工具,并不是取代rpm后端管理工具,它只是提供了较好的.基于仓库的.完成元数据自动分析以及依赖关系自动分析及自动解决的这么一个工具,但是强依赖于yum仓库的存在,但是yum的工作架构为C/S架构,首先,对于需要安装某个程序软件来讲,我们就称之为客户端(yum client),而我们管理程序包所使用的命令为yum命令.而服务器端并不是yum服务器端,但我们可以称之为yum的仓库端(yum rep

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

bash脚本编程for

bash脚本编程:        if语句.bash -n.bash -x CONDITION:            bash命令:                用命令的执行状态结果:                    成功:true                    失败:flase 成功或失败的意义:取决于用到的命令: 单分支:            if CONDITION; then                if-true            fi 双分支:     

bash脚本编程基础

bash编程   bash脚本编程是过程式解释编程,其实就是linux命令的堆砌,既然是编程就应该有相应编程语法.    与任何过程式编程一样,过程式编程的特点就是:顺序执行,选择执行,循环执行.    过程式编程:以指令为中心,设计算法,数据服务于算法,过程式编程的灵魂:算法.    1.变量:数值变量,字符变量           bash环境:                本地变量:当前shell进程:                环境变量:当前shell进程及其子进程:       

bash脚本编程的语法知识点总结第一部分

bash脚本编程的所有语法知识点总结第一部分 名词概念 bash脚本编程,从字面意思理解也就是shell脚本编程.bash应该是目前Linux上最流行的shell脚本解释程序.shell是一个命令语言解释器,而shell脚本则是Linux命令的集合,按照预设的顺序依次解释执行,来完成特定的.较复杂的系统管理任务,类似于Windows中的批处理文件. 1.shell脚本格式 第一行,顶格. eg: #!/bin/bash #!/usr/bin/python 其它的以#开头的行均为注释,会被解释器忽

bash脚本编程详细剖析

bash脚本编程详细剖析          背景:bash脚本编程是Linux学习一个至关重要的部分,想完成一个脚本可能很简单:但是想让自己的脚本写的让人觉得心旷神怡实为不简单.bash是所有Linux发行版的几乎都有的,因此我们这里以bash脚本为例,讨论bash脚本的编写方法.对于bash脚本编程中一些比较重要的知识点,我这里也会给予案例演示. 一.脚本编程中前话: 我们都知道,bash脚本编程说白了就是命令的堆积.只不过这种堆积的方式不是杂乱无章的堆积,而是按照一定要求和格式的链接.这说明

bash脚本编程入门

bash脚本编程(与面向过程相似) 一.基础知识 1.程序:语句和表达式 顺序执行 选择执行 循环执行 2. 程序 = 指令 + 数据 面向过程编程  :以指令为中心组织数据 面向对象编程  :以数据为中心组织指令 3.程序的执行模型 : (以C语言编程为例)编译执行:源代码->预处理->编译->汇编->链接(通过编译器)->运行 (bash脚本编程) 解释执行:源码  ->(解释器)-> 运行 bash脚本的解释器bash bash脚本一般以.sh结尾,例如vi

bash脚本编程知识储备

bash脚本编程: ????脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习) ???????????? 流程控制语句: ???????????????? 顺序执行: ???????????? 循环执行: ???????????????? 选择执行: 2. ????????bash变量是弱类型:默认字符型: ? ????????变量引用:${VAR_NAME} ????????引号: ?

Bash脚本编程总结

bash脚本编程之用户交互: read [option]- [name -]  -p 'PROMPT'  -t TIMEOUT bash -n /path/to/some_script  检测脚本中的语法错误 bash -x /path/to/some_script  调试执行 示例: #!/bin/bash   # Version: 0.0.1   # Author: mrlapulga   # Description: read testing   read -p "Enter a disk

高级Bash脚本编程指南

http://tldp.org/LDP/abs/html/ 高级Bash脚本编程指南对脚本语言艺术的深入探索 本教程不承担以前的脚本或编程知识,但进展迅速走向一个中级/高级水平的指令...一直偷偷在细小的UNIX®智慧和学识.它作为一本教科书,一本手册,自学,并作为一个参考和知识的来源,壳牌的脚本技术.练习和大量的评论实例请读者参与,在这样的前提下,真正学习脚本的唯一途径是编写脚本.这本书是适合课堂使用的一般介绍编程的概念.本文件被授予公共领域.没有版权! 奉献对于安妮塔,所有魔术的来源内容表第