本文最后更新于 392 天前,其中的信息可能已经过时,如有错误请发送邮件到 wuxianglongblog@163.com
在计算机科学中,for 循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行。
它跟其他的循环,如 while 循环,最大的不同,是它拥有一个循环计数器,或是循环变数。这使得 for 循环能够知道在迭代过程中的执行顺序。
shell 中的 for 循环与在 c 中不同,它包含三种形式:第一种结构是列表 for 循环;第二种结构就是不带列表的 for 循环;第三种就类似于 C 语言。
① 列表 for 循环 (常用)
| |
| for i in 取值列表 |
| do |
| 循环主体/命令 |
| done |
② 不带列表 for 循环 (示例)
| |
| echo "惨绿少年的博客是:" |
| for i |
| do |
| echo "$i" |
| done |
| 脚本执行结果 |
| [root@clsn for] |
| 惨绿少年的博客是: |
| http: |
③ 类似 C 语言的风格(这种用法常在 C 语语言中使用)
| for((exp1;exp2;exp3)) |
| do |
| 指令... |
| done |
| 编写类似C语言风格脚本 |
| for((i=0;i<=3;i++)) |
| do |
| echo $i |
| done |
| 脚本执行过程 |
1.2.1 【练习题 1】批量生成随机字符文件名案例
使用 for 循环在 /clsn 目录下批量创建 10 个 html 文件,其中每个文件需要包含 10 个随机小写字母加固定字符串 clsn,名称示例如下:
| [root@znix C19]# ls /clsn |
| apquvdpqbk_clsn.html mpyogpsmwj_clsn.html txynzwofgg_clsn.html |
| bmqiwhfpgv_clsn.html udrzobsprf_clsn.html vjxmlflawa_clsn.html |
| jhjdcjnjxc_clsn.html qeztkkmewn_clsn.html jpvirsnjld_clsn.html |
| ruscyxwxai_clsn.html |
脚本内容
| [root@clsn for] |
| [ -d /clsn ] || mkdir -p /clsn |
| rpm -qa |grep pwgen &>/dev/null |
| if [ $? -eq 1 ] |
| then |
| yum install pwgen -y &>/dev/null |
| fi |
| |
| cd /clsn &&\ |
| for i in {1..10} |
| do |
| |
| File_Name2=`pwgen -1A0 10` |
| touch ${File_Name2}_clsn.html |
| done |
View Code 批量生成随机字符文件名
脚本执行结果
| [root@clsn for]# ls -l /clsn |
| -rw-r--r-- 1 root root 0 12月 8 19:41 aegheiriek_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 aifohxique_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 caexahween_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 ciefaivaib_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 eixongooph_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 foozaivedo_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 ireeteethu_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 ohmeebivae_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 oiceehahth_clsn.html |
| -rw-r--r-- 1 root root 0 12月 8 19:41 sheewaehoo_clsn.html |
在编程语言中,while 循环(英语:while loop)是一种控制流程的陈述。利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个表达式的返回值为 “真”(true)时,则反复执行循环体内的程式码;若表达式的返回值为 “假”(false),则不再执行循环体内的代码,继续执行循环体下面的代码。
因为 while 循环在区块内代码被执行之前,先检查陈述是否成立,因此这种控制流程通常被称为是一种前测试循环(pre-test loop)。相对而言 do while 循环,是在循环区块执行结束之后,再去检查陈述是否成立,被称为是后测试循环。
多用于创建守护进程
【示例 1】:while 实现 web 服务器搭建
脚本代码
| [root@clsn scripts] |
| |
| while true |
| do |
| echo "ok" | nc -l 81 |
| done |
客户端进行访问测试
服务端显示结果:
| [root@clsn scripts] |
| GET / HTTP/1.1 |
| User-Agent: curl/7.29.0 |
| Host: 10.0.0.180:81 |
| Accept: */* |
补充定时任务功能,执行小于 1 秒的定时任务
循环执行某些操作,
条件与循环控制及程序返回值命令表
命令 |
说明 |
break n |
如果省略 n,则表示跳出整个循环,n 表示跳出循环的层数 |
continue n |
如果省略 n,则表示跳过本次循环,忽略本次循环的剩余代码,进人循环的下一次循环。 n 表示退到第 n 层继续循环 |
exit n |
退出当前 Shell 程序,n 为上一次程序执行的状态返回值。n 也可以省略,在下一个 Shell 里可通过 "$?" 接收 exit n 的 n 值 |
return n |
用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个 Shell 里可通过 "$?" 接收 exit n 的 n 值 |
简单来说即:
| break 跳出循环 |
| continue 跳出本次循环 |
| exit 退出脚本 |
| return 与 exit 相同,在函数中使用 |
| [root@clsn scripts]# help break |
| break: break [n] |
| 退出 for、while、或 until 循环 |
| |
| 退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则打破N重 |
| 循环 |
| 退出状态: |
| 退出状态为0除非 N 不大于或等于 1。 |
| [root@clsn scripts]# help continue |
| continue: continue [n] |
| 继续 for、while、或 until 循环。 |
| |
| 继续当前 FOR、WHILE 或 UNTIL 循环的下一步。 |
| 如果指定了 N, 则继续当前的第 N 重循环。 |
| 退出状态: |
| 退出状态为 0 除非 N 不大于或等于1。 |
| [root@clsn scripts] |
| exit: exit [n] |
| 退出shell。 |
| |
| 以状态 N 退出 shell。 如果 N 被省略,则退出状态 |
| 为最后一个执行的命令的退出状态。 |
| [root@clsn tuichu]# help return |
| return: return [n] |
| 从一个 shell 函数返回。 |
| |
| 使一个函数或者被引用的脚本以指定的返回值 N 退出。 |
| 如果 N 被省略,则返回状态就是 |
| 函数或脚本中的最后一个执行的命令的状态。 |
| |
| 退出状态: |
| 返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。 |
通常在开发 Shell 脚本时,定义变量采用的形式为 “a=l;b=2;C=3”,可如果有多个 变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以 进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生 了,它就是为了解决上述问题而出现的。
Shell 的数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来 命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编 号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
| 数组的定义 |
| |
| [root@clsn scripts] |
| |
| [root@clsn scripts] |
| 001 002 003 |
| |
| [root@clsn scripts] |
| 3 |
查:遍历数组的内容
| |
| [root@clsn scripts] |
| 001 |
| [root@clsn scripts] |
| 002 |
| [root@clsn scripts] |
| 003 |
| [root@clsn scripts] |
遍历数组
| |
| [root@clsn scripts] |
| 001 |
| 002 |
| 003 |
| |
| [root@clsn scripts] |
| [root@clsn scripts] |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
增:数组添加
| [root@clsn scripts] |
| [root@clsn scripts] |
| 001 002 003 004 |
改:数组修改
| [root@clsn scripts] |
| [root@clsn scripts] |
| 001 002 000 004 |
删:数组删除
| [root@clsn scripts] |
| [root@clsn scripts] |
| 3 |
| [root@clsn scripts] |
| 001 002 004 |
| 1.6.4 将命令的结果赋值给数组 |
| dir=(`ls`) |
| dir=($(ls)) |
命令定义数组
| [root@clsn scripts] |
| [root@clsn scripts] |
| bianliang.sh case cfb.sh chanshu.sh check check_url.sh |
| clsn.sh clsn_test.sh daojishi.sh ddos_check.sh echo.sh for for2 fruits.sh |
| function fz.sh html jingdutiao.sh jishuanqi2.sh jishuanqi.sh lamp.sh lnmp.sh |
| memcache_check.sh menu.sh nginx.sh panduan panduan1 play quanju.sh rsync_check.sh |
| rsyncd system6 tuichu web_check.sh web_view.sh while xiugaizhuji.sh yhk.sh yunshuan.sh |
| zhuajiu.sh |
| [root@clsn scripts]# a=(1 2 3 ) |
| [root@clsn scripts]# b=( |
| > 2 |
| > 3 |
| > 4 |
| > ) |
| > [root@clsn scripts] |
| > 1 2 3 |
| > [root@clsn scripts] |
| > 1 2 3 4 |
在 shell 常用的功能是查
| array=(valuel value2 value3 ...) |
打印数组格式
| ${array[@]} 所有元素 |
| ${ |
| ${array[i]} 单个元素,i是下标 |
shell 一个非常重要的特性是它可作为一种编程语言来使用。因为 shell 是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。
针对此问题,许多 shell(如 BourneAgainShell)都包含 shell 函数,shell 把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell 还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。
🐟 把相同的程序段定义成函数,可以减少代码量。
🐟 增加程序的可读、易读性
🐟 实现程序功能的模块化
| function clsn(){ |
| echo "http://blog.znix.top" |
| } |
| |
| znix(){ |
| echo "http://www.znix.top " |
| } |
说明:
1、可以带 function clsn () 定义,也可以直接 clsn () 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n (0-255)
3、执行函数就是将函数名放到定义的函数之后即可
将函数加载到当前窗口执行:
| [root@clsn function] |
| [root@clsn function] |
| znew znix |
| [root@clsn function] |
| test |
| [root@clsn function] |
| http://blog.znix.top |
脚本内容
| [root@clsn function] |
| |
| Fun_File=/server/scripts/function/fun1.sh |
| [ -f $Fun_File ] && . $Fun_File |
| clsn |
脚本执行结果
| [root@clsn function]# sh fun2.sh |
| http://blog.znix.top |
1.7.4 函数传参
脚本内容:
| [root@clsn function] |
| |
| |
| function clsn(){ |
| echo "Hi " |
| } |
| CLSN(){ |
| echo "Hello " |
| echo $0 |
| echo $1 |
| echo $2 |
| |
| } |
| clsn |
| CLSN xi xi |
脚本执行结果
| [root@clsn function]# sh fun3.sh |
| Hi |
| Hello |
| fun3.sh |
| xi |
| xi |
| function clsn(){ |
| echo "http://blog.znix.top $1 $2" |
| echo $0 |
| } |
| |
| znix(){ |
| echo "test" |
| } |
| clsn $1 $2 |
| |
| 执行结果 |
| [root@clsn function] |
| http://blog.znix.top |
| fun1.sh |
脚本内容:
| [root@clsn function] |
| |
| |
| function clsn(){ |
| echo "Hi " |
| } |
| CLSN(){ |
| echo "Hello " |
| echo $0 |
| echo $1 |
| echo $2 |
| return 4 |
| echo "xxixiixxiix" |
| } |
| clsn |
| CLSN xi xi |
| echo $? |
脚本执行结果
| [root@clsn function] |
| Hi |
| Hello |
| fun3.sh |
| xi |
| xi |
| 4 |
| return |
命令说明:
| [root@clsn function]# help return |
| return: return [n] |
| 从一个 shell 函数返回。 |
| 使一个函数或者被引用的脚本以指定的返回值 N 退出。 |
| 如果 N 被省略,则返回状态就是 |
| 函数或脚本中的最后一个执行的命令的状态。 |
| 退出状态: |
| 返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。 |