1.shell里的for循环怎么写
for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。for的语法结构如下:1234for 变量 in 串行do 执行命令done说明: 行1,讲串行中的字段迭代放入变量中 行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段军处理过为止。
流程图:用例1 用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录123456789101112#!/bin/bashfor k in $( seq 1 10 )do mkdir /home/kuangl/aaa${k} cd /home/kuangl/aaa${k} for l in $( seq 1 10 ) do mkdir bbb${l} cd /home/kuangl/aaa${k} done cd ..done说明: 行2,seq 用于产生从某个数到另外一个数之间的所有整数。 行4,在家目录下创建文件夹。
行6,在使用一个for循环创建文件夹测试结果:[root@test01 kuangl]# lltotal 80drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa1drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa10drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa2drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa3drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa4drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa5drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa6drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa7drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa8drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa9[root@test01 kuangl]# cd aaa1[root@test01 aaa1]# lltotal 40drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb1drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb10drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb2drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb3drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb4drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb5drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb6drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb7drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb8drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb91用例2 列出var目录下各子目录占用磁盘空间的大小。1234567#!/bin/bashDIR="/var"cd $DIRfor k in $(ls $DIR)do [ -d $k ] && du -sh $kdone说明: 行4,对/var目录中每一个文件,进行for循环处理。
行6,如果/var下的文件是目录,则使用du -sh计算该目录占用磁盘空间的大小。测试结果:[root@test01 scripts]# ./var.sh276M cache4.0K cvs84K db8.0K empty4.0K ftp4.0K games4.0K gdm21G lib4.0K local16K lock7.4G log4.0K logs0 mail4.0K nis4.0K opt4.0K preserve336K run3.7G spool212K tmp4.1G e $varible1 times "donedo和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。
Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如计算1~100内所有的奇数之和。
#!/bin/bashsum=0for i in {1..100..2}dolet "sum+=i"doneecho "sum=$sum" 通过i的按步数2不断递增,计算sum值为2500。同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100。
for循环对字符串进行操作,例如通过for循环显示当前目录下所有的文件。#!/bin/bashfor file in $( ls )#for file in *doecho "file: $file"done 也可一使用for file in *,通配符*产生文件名扩展,匹配当前目录下的所有文件。
for通过命令行来传递脚本中for循环列表参数#!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument in "$@"doecho "$argument"done$#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。(3)不带列表for循环 由用户制定参数和参数的个数,与上述的for循环列表参数功能相同。
#!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argumentdoecho "$argument"done比上述代码少了$@参数列表,$*参数字符串。(4)类C风格的for循环 也被称为计次循环#!/bin/bashfor((integer = 1; integer <= 5; integer++))do echo "$integer"done for中第一个表达式(integer = 1)是循环变量赋初值的语句,第二个表达式(integer <= 5)决定是否进行循环的表达式,退出状态为非0时将退出for循环执行done后的命令(与C中的for循环条件是刚好相反的)。
第三个表达式(integer++)用于改变循环变量的语句。Sheel中不运行使用非整数类型的数作为循环变量,循环条件被忽略则默认的退出状态是0,for((;;))为死循环。
类C的for循环计算1~100内所有的奇数之和。#!/bin/bashsum=0for(( i = 1; i <= 100; i = i + 2 ))dolet "sum += i"doneecho "sum=$sum"2、while循环 也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。
为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。(1)计数器控制的while循环#!/bin/bashsum=0i=1while(( i <= 100 ))dolet "sum+=i"let "i += 2" doneecho "sum=$sum" 指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100。
在循环条件中设置了计数器加2来计算1~100内所有的奇数之和。(2)结束标记控制的while循环 设置一个特殊的数据值(结束标记)来结束while循环。
#!/bin/bashecho "Please input the num(1-10) "read numwhile [[ "$num" != 4 ]]do if [ "$num" -lt 4 ]thenecho "Too small. Try again!"read numelif [ "$num" -gt 4 ]thenecho "To high. Try again" read numelseexit 0fidoneecho "Congratulation, you are right! " 例:通过结束标记控制实现阶乘的操作#!/bin/bashecho "Please input the num "read numfactorial=1while [ "$num" -gt 0 ]dolet "factorial= factorial*num"let "num--"doneecho "The factorial is $factorial"(3)标志控制的while循环使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件)。#!/bin/bashecho "Please input the num "read numsum=0i=1signal=0while [[ "$signal" -ne 1 ]]doif [ "$i" -eq "$num" ]thenlet "signal=1"let "sum+=i"echo "1+2+。
+$num=$sum"elselet "sum=sum+i"let "i++"fidone 标志控制的while循环求1~n的累加和,循环变量值小于100执行else累加同时循环变量加1,直到循环变量值等于100将标志值设置为1,并输出。标志控制的while循环与结束标记控制的while循环的区别是用户无法确定无法确定结束标志,只能程序运行后确定结束标志。
两者也可以相互转化。(4)命令行控制的while循环 使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替$2,并使$#变量递减),当最后一个参数显示给用户,$#会等于0,$*也等于空。
#!/bin/bashecho "number of arguments is $#"echo "What you input is: "while [[ "$*" != "" ]]doecho "$1"shiftdone循。
转载请注明出处育才学习网 » bashfor循环怎么写