写的几个笔记略显凌乱。将它们整理了下放在博客上:

构建基本shell脚本

Linux结构化命令

嵌套循环

在循环语句内使用任意类型的命令,包括其他循环命令,叫做嵌套循环。因为是在迭代中迭代,需要注意变量的使用以及程序的效率问题。

下面举一个for循环嵌套for循环的例子:

wangsx@SC-201708020022:~/tmp$ cat test14

#!/bin/bash

# nesting for loops

for (( a = 1; a <= 3; a++ ))

do

echo "Starting loop $a:"

for (( b = 1; b <= 3; b++ ))

do

echo " Inside loop: $b"

done

done

wangsx@SC-201708020022:~/tmp$ . test14

Starting loop 1:

Inside loop: 1

Inside loop: 2

Inside loop: 3

Starting loop 2:

Inside loop: 1

Inside loop: 2

Inside loop: 3

Starting loop 3:

Inside loop: 1

Inside loop: 2

Inside loop: 3

shell能够自动识别匹配的do和done字符。这种模式很常见,比如通常的小括号((与))、中括号、花括号匹配等等。它们的本质都是字符匹配。

在混用循环命令时也一样,比如在while循环中内嵌一个for循环:

wangsx@SC-201708020022:~/tmp$ cat test15

#!/bin/bash

# placing a for loop inside a while loop

var1=5

while [ $var1 -ge 0 ]

do

echo "Outer loop: $var1"

for (( var2 = 1; $var2 < 3; var2++))

do

var3=$[ $var1 * $var2 ]

echo " Inner loop: $var1 * $var2 = $var3"

done

var1=$[ $var1 - 1 ]

done

wangsx@SC-201708020022:~/tmp$ . test15

Outer loop: 5

Inner loop: 5 * 1 = 5

Inner loop: 5 * 2 = 10

Outer loop: 4

Inner loop: 4 * 1 = 4

Inner loop: 4 * 2 = 8

Outer loop: 3

Inner loop: 3 * 1 = 3

Inner loop: 3 * 2 = 6

Outer loop: 2

Inner loop: 2 * 1 = 2

Inner loop: 2 * 2 = 4

Outer loop: 1

Inner loop: 1 * 1 = 1

Inner loop: 1 * 2 = 2

Outer loop: 0

Inner loop: 0 * 1 = 0

Inner loop: 0 * 2 = 0

如果想要挑战脑力,可以混用until和while循环。

wangsx@SC-201708020022:~/tmp$ cat test16

#!/bin/bash

# using until and while loop

var1=3

until [ $var1 -eq 0 ]

do

echo "Outer loop: $var1"

var2=1

while [ $var2 -lt 5 ]

do

var3=$(echo "scale=4; $var1 / $var2" | bc)

echo " Inner loop: $var1 / $var2 = $var3"

var2=$[ $var2 + 1 ]

done

var1=$[ $var1 - 1 ]

done

wangsx@SC-201708020022:~/tmp$ . test16

Outer loop: 3

Inner loop: 3 / 1 = 3.0000

Inner loop: 3 / 2 = 1.5000

Inner loop: 3 / 3 = 1.0000

Inner loop: 3 / 4 = .7500

Outer loop: 2

Inner loop: 2 / 1 = 2.0000

Inner loop: 2 / 2 = 1.0000

Inner loop: 2 / 3 = .6666

Inner loop: 2 / 4 = .5000

Outer loop: 1

Inner loop: 1 / 1 = 1.0000

Inner loop: 1 / 2 = .5000

Inner loop: 1 / 3 = .3333

Inner loop: 1 / 4 = .2500

外部的until循环以值3开始,并继续执行到值等于0。内部while循环以值1开始一直执行,只要值小于5。需要注意循环条件的设置,我跑的几次都没写完整,然后无限循环只好重开终端。

控制循环

之前的学的命令已经可以让我们写循环程序了,设定好以后等待命令开始执行和等待循环结束。但是很多情况下,在循环中我们设定的某个(多个)变量达到某种条件时,我们就想要停止循环,然后运行循环下面的命令。这时候我们需要用到break和continue命令来帮我们控制住循环。

这两个命令在其他语言中基本都时关键字,特别是C,用法差不多。我也就不具体介绍了,只点出它们的功能。

break

在shell执行break命令时,它会尝试跳出当前正在执行的循环。

在处理多个循环时,break命令会自动终止你所在的最内层循环。

break命令接受单个命令行参数值:

​ break n

​ 其中n制订了要跳出的循环层级(层数)

continue

continue命令可以提前终止某次循环的命令,但并不会完全终止整个循环。可以在循环内部设置shell不执行命令的条件。

也就是说使用continue命令时,它会自动跳过本次循环中接下来的运行步骤,跳转到下一次循环。但注意不是跳出,跳出时break的功能。

同样的可以使用continue n n制定要继续执行哪一级循环

处理循环的输出

在shell脚本中,我们可以对循环的输出使用管道或进行重定向。这是通过在done命令之后添加一个处理命令来实现的。

wangsx@SC-201708020022:~/tmp$ cat test

#!/bin/bash

for file in /home/*

do

if [ -d "$file" ]

then

echo "$file is a directory"

else

echo "$file is a file"

fi

done > output.txt

wangsx@SC-201708020022:~/tmp$ cat output.txt

/home/wangsx is a directory

shell将for命令的结果重定向到文件output.txt中,而不是显示在屏幕上。

实例

下面两个例子演示如何用简单循环来处理数据。

查找可执行文件

Linux运行程序时通过环境变量$PATH提供的目录搜索可执行文件。如果徒手找的话,比较费时间,我们可以写个脚本来搞定它。

wangsx@SC-201708020022:~$ cat test25

#!/bin/bash

# finding files in the PATH

IFS=:

for folder in $PATH

do

echo "$folder:"

for file in $folder/*

do

if [ -x $file ]

then

echo " $file"

fi

done

done

# 输出结果太多,我就不拷贝结果了

先设定IFS分隔符以便于能正确分隔目录,然后将目录存放在$folder中,用for循环来迭代特定的目录中所有文件,然后用if-then命令检查文件的可执行权限。

Linux有一个tree工具,非常方便输出目录结构,推荐使用下。

创建多个用户账号

如果你是管理员,需要创建大量账号时。不必每次都有useradd命令添加用户。将用户信息存放在指定文件,然后用脚本进行处理就可以了。

用户信息的格式如下:

userid, user name

第一个是你为用户选择的id,第二个是用户的全名。这是csv文件格式。

为了能够读取它,我们使用以下命令:

while IFS=',' read -r userid name

read命令会自动获取.csv文本文件的下一行内容,所以不用再写一个循环来处理。当read命令返回FALSE时(也就是读完了),while命令就会退出。

为了把数据从文件导向while命令,只要再while命令尾部加一个重定向符号。

处理过程写成脚本如下:

#!/bin/bash

# process new user accounts

input="users.csv"

while IFS=',', read -r userid name

do

echo "adding $userid"

useradd -c "$name" -m $userid

done < "$input"

linux 如何取执行一个脚本5000次,【shell笔记脚本】嵌套、控制循环以及处理循环输出...相关推荐

  1. 定时每天凌晨一点在linux系统上执行一个autobuild.sh脚本如何实现?

    定时每天凌晨一点在linux系统上执行一个autobuild.sh脚本如何实现? 可以使用linux的计划任务功能crontab来实现定时执行脚本. 具体步骤如下: 编辑crontab计划任务列表: ...

  2. Linux入门--教程3(点灯笼) Shell Scirpt 脚本

    目录 1_  > 2_ 脚本文件test.sh 3_  echo 4_expr用于计算式子 5_关于 \* 使用 5_括号 () 也需要加 \ 使用,  如 \(     \) 7_ linux ...

  3. squirrel 脚本_Squirrel便携式Shell和脚本语言

    1799年,一位法国陆军工程师做出了惊人的发现. 不,不是鹅肝,卡门培尔奶酪,巴氏杀菌法或萨特法,而是罗斯塔石,这是解密埃及大部分古代象形文字的关键(参见图1). 图1. Rosetta石头,一种11 ...

  4. Linux与Shell学习--shell系列11--流程控制4(until循环)

    until循环和while循环整体概念是一样的,只不过while循环的循环前提是满足while判断时进入子模块中,当不满足while判断条件时跳出循环,如果while判断条件一直满足就一直进行循环:u ...

  5. Linux(四):Vim 编辑器与 Shell 命令脚本

    Vim 文本编辑器 Vim的三种模式 命令模式:控制光标移动,可对文本进行复制.粘贴.删除和查找等工作. 输入模式:正常的文本录入. 末行模式:保存或退出文档,以及设置编辑环境. Vim 编辑器模式的 ...

  6. Linux入门--教程4(点灯笼) Shell Scirpt 脚本 string字符串 专题

    目录 1_打印字符串 2_输入 3_比较字符 4_拼接字符串 5_数组 1_打印字符串 a="hello" b="world"echo $a $b 输出如下,, ...

  7. shell脚本实战(第2版)/人民邮电出版社 脚本12 构建shell叫脚本库

    首先,需要将用到的函数全部放入一个文件中,此文件命名为(library.sh) initailizeANSI() {esc=".033"blackf="${esc}[30 ...

  8. linux脚本调用db2存储过程,LINUX定时执行含有DB2存储过程的SHELL脚本

    <LINUX定时执行含有DB2存储过程的SHELL脚本>由会员分享,可在线阅读,更多相关<LINUX定时执行含有DB2存储过程的SHELL脚本(6页珍藏版)>请在人人文库网上搜 ...

  9. Linux crontab 定时执行脚本

    不废话,直接上你要的:  如框框内所示,该命令表示每十分钟执行一次该目录下的脚本文件,即 /home/alan/test1.sh Ok,现在具体讲一下命令为何这么写. 一:什么是crond,什么又是c ...

最新文章

  1. 标准情况下的最优方案与魔鬼赛道
  2. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
  3. Bochs调试及相关仿真工具的使用方法
  4. mysql批量修改http为https,墨涩网 - typecho系统升级全站https数据库批量替换网址/内容——墨涩网...
  5. FTP匿名用户的配置
  6. 单点登录Redis存储Session及SessionId问题说明与集群实战-4
  7. 绘制基础知识-canvas paint
  8. Utility.cpp的函数
  9. MockWebServer--环境
  10. multiple多图选择,借助FormData通过ajax实现上传
  11. cadz轴归零命令_CAD中所有图形实现统一标高(Z轴归零)的方法,统一标高的快捷键命令...
  12. java 获取中文拼音首字母(缩写) 含pinyin4j maven包
  13. python·文本分析
  14. 扫一下这个神奇的二维码,Wifi不用输密码
  15. springboot集成camunda
  16. 2020年11月总结
  17. 线程学习(13)-偏向锁
  18. 安全、性能测试常见问题与注意事项
  19. 强化学习代码实操和讲解(三)
  20. 新年快乐ctf_新年快乐+ 2012桌面壁纸

热门文章

  1. linux如何压缩数据库,linux mysql数据库压缩表空间
  2. shell中返回值是1为真还是假_肝!Shell 脚本编程最佳实践
  3. mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改
  4. leetcode390(2022 1.2)
  5. Redis事务和秒杀业务设计
  6. Kotlin学习笔记20 阶段复习2
  7. Android笔记 get方式提交数据到服务器 避免乱码 demo
  8. 用Python批量修改图片名称(后缀)
  9. 【java基础知识】修改字符串的编码格式
  10. JVM 堆内存设置原理