热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux_《Linux命令行与shell脚本编程大全》第十三章学习总结

时间:2017年09月13日星期三说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linu

时间:2017年09月13日星期三
说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十三章学习总结

第十三章:更多的结构化命令

本章内容

for循环语句
until迭代语句使用while语句
循环
重定向循环的输出
13.1 for命令

命令格式

for var in list
docommands
done

命令说明:变量var为list中的迭代值,在do和done语句之间输入的命令可以是一条或多条标准的bash shell命令。

13.1.1 读取列表中的值

for命令最基本的用法就是遍历for命令自身所定义的一系列值

编写test1.sh脚本

#!/bin/bash
for test in One The Three Four Five Six
doecho "The next number is $test"
done

编写test1b.sh脚本

#!/bin/bashfor test in One The Three Four Five Six
doecho "The next number is $test"
doneecho "The last number is $test"
test=Seven
echo "Now, Test number is $test"

13.1.2 读取列表中的复杂值

for循环假定每个值都是用空格分割的
当某个值有特殊字符时,需要进行转义
可以使用转义字符(反斜线)和双引号
当某个值包含空格时,需使用双引号

编写test2.sh脚本

#!/bin/bash
for test in I don\'t know "this'll" work
doecho "word:$test"
done

编写test3.sh脚本

#!/bin/bash
for test in Nevada "New Hampshire" "New Mexico" "New York"
doecho "Now going to $test"
done

13.1.3 从变量读取列表

编写test4.sh脚本

#!/bin/bash
list="One Two Three"
list=$list" Four"
for number in $list
doecho "The number is $number"
done

13.1.4 从命令读取值

生成列表中所需值的另外一个途径就是使用命令的输出
可以用命令来替换执行任何能产生输出的命令
然后在for命令中使用该命令的输出

编写number文本

One
Two
Three

编写test5.sh脚本

#!/bin/bash
file="number"
for number in $(cat $file)
doecho "The number is $number"
done

13.1.5 更改字段分隔符

bash shell会将空格/制表符/换行符当做字段分割符

使用换行符作为字段分隔符IFS=$'\n'
则bash shell会忽略空格和制表符
也可以自定义使用特定字符作为字段分隔符

编写test5b.sh脚本

#!/bin/bash
file="number"
IFS=$'\n'
for number in $(cat $file)
doecho "The number is $number"
done

13.1.6 用通配符读取目录

可以使用for命令来自动遍历目录中的文件

编写test6.sh脚本

#!/bin/bash
for file in /home/zc/test/unit13/*
doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"fi
done

编写test7.sh脚本

#!/bin/bash
for file in /home/zc/test/unit13/*.sh /home/zc/test/unit12
doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"fi
done
13.2 C语言风格的for命令

13.2.1 C语言的for命令

C语言for格式

for (i&#61;0;i<10;i&#43;&#43;)
{printlf("The next number is $d\n",i);
}

bash中C语言风格的for循环格式

for (( variable assignment ; condition ; iteration process ))
变量赋值可以有空格
条件中的变量不可以美元符开头
迭代过程的算式未用expr命令格式

编写test8.sh脚本

#!/bin/bash
for (( i&#61;1; i<&#61;10;i&#43;&#43; ))
doecho "The next number is $i"
done

13.2.2 使用多个变量

编写test9.sh脚本

#!/bin/bash
for(( a&#61;1,b&#61;10;a<&#61;10;a&#43;&#43;,b-- ))
doecho "$a - $b"
done
13.3 while命令

13.3.1 while的基本格式

命令格式

while test command
doother commands
done

命令说明

while命令中定义的test command和if-then语句中的格式一模一样
while命令的关键在于所指定的test command的退出状态码必须随着循环中运行的命令而改变
如果退出状态码不发生变化&#xff0c;while循环将一直不停的进行下去

编写test10.sh脚本

#!/bin/bash
var1&#61;10
while [ $var1 -gt 0 ]
doecho $var1var1&#61;$[ $var1 - 1 ]
done

13.3.2 使用多个测试命令

while命令允许你在while语句定义多个测试条件
只有最后一个测试条件的退出状态吗会被用来决定什么时候结束循环
注意&#xff0c;每个测试命令都出现在单独的一行上

编写test11.sh脚本

#!/bin/bash
var1&#61;10
while echo $var1[ $var1 -ge 0 ]
doecho "The is inside the loop"var1&#61;$[ $var1 - 1 ]
done
13.4 until命令

命令格式

until test commands
doother commands
done

命令说明

until命令和while命令工作的方式完全相反
untile命令要求你指定一个通常返回非零退出状态码的测试命令
只有测试命令的退出状态码不为0&#xff0c;bash shell才会执行循环中列出的命令
一旦测试命令返回了退出状态码0&#xff0c;循环就结束了

编写test12.sh脚本

#!/bin/bash
var1&#61;100
until [ $var1 -eq 0 ]
doecho $var1var1&#61;$[ $var1-25 ]
done

编写test13.sh脚本

#!/bin/bash
var1&#61;100
until echo $var1[ $var1 -eq 0 ]
doecho Inside the loop: $var1var1&#61;$[ $var1-25 ]
done
13.5 嵌套循环

循环语句可以在循环内使用任意类型的命令&#xff0c;包括其他循环命令

编写test14.sh脚本

#!/bin/bashfor (( a&#61;1;a<&#61;3;a&#43;&#43;))
doecho "Starting loop $a:"for (( b&#61;1;b<&#61;3;b&#43;&#43;))doecho " Inside loop:$b"done
done

编写test15.sh脚本

#!/bin/bashvar1&#61;5while [ $var1 -ge 0 ]
doecho "Outer loog:$var1"for (( var2&#61;1;$var2<3;var2&#43;&#43; ))dovar3&#61;$[ $var1 * $var2 ]echo " Inner loop:$var1*$var2&#61;$var3"donevar1&#61;$[ $var1 - 1 ]
done

编写test16.sh脚本

#!/bin/bashvar1&#61;3until [ $var1 -eq 0 ]
doecho "Outer loop:$var1"var2&#61;1while [ $var2 -lt 5 ]dovar3&#61;$(echo "scale&#61;4;$var1 / $var2" | bc)echo " Inner loop:$var1 / $var2 &#61; $var3"var2&#61;$[ $var2&#43;1 ]donevar1&#61;$[ $var1 - 1 ]
done
13.6 循环处理文件数据

通常必须遍历存储在文件中的数据&#xff0c;这需要结合以下技术实现

使用嵌套循环&#xff1a;再次利用循环来读取每一行中的数据
修改IFS环境变量&#xff1a;强制for命令将文件中的每行都当成单独的一个条目来处理
13.7 控制循环

13.7.1 break命令

用break命令来退出任意类型的循环&#xff0c;包括while和until循环

1.跳出单个循环

编写test17.sh脚本

#!/bin/bash
for var1 in 1 2 3 4 5 6 7 8 9 10
doif [ $var1 -eq 5 ]thenbreakfiecho "Iteration number:$var1"
done
echo "The for loop is completed"

编写test18.sh脚本

#!/bin/bash
var1&#61;1
while [ $var1 -lt 10 ]
doif [ $var1 -eq 5 ]thenbreakfiecho "Iteration:$var1"var1&#61;$[ $var1&#43;1 ]
done
echo "The while loop is completed"

2.跳出内部循环

编写test19.sh脚本

#!/bin/bash
for (( a&#61;1;a<4;a&#43;&#43; ))
doecho "Outer loop:$a"for (( b&#61;1;b<100;b&#43;&#43; ))doif [ $b -eq 5 ]thenbreakfiecho " Inner loop:$b"done
done

3.跳出外部循环

编写test20.sh脚本

#!/bin/bashfor (( a&#61;1;a<4;a&#43;&#43; ))
doecho "Outer loop:$a"for(( b&#61;1;b<100;b&#43;&#43; ))doif [ $b -gt 4 ]thenbreak 2fiecho " Inner loop:$b"done
done

13.7.2 continue命令

编写test21.sh脚本

#!/bin/bash
for (( var1&#61;1;var1<15;var1&#43;&#43; ))
doif [ $var1 -gt 5 ] && [ $var1 -lt 10 ]thencontinuefiecho "Iteration number:$var1"
done

编写test22.sh脚本

#!/bin/bash
for (( a&#61;1;a<&#61;5;a&#43;&#43; ))
doecho "Iteration $a:"for (( b&#61;1;b<3;b&#43;&#43; ))doif [ $a -gt 2 ] && [ $a -lt 4 ]thencontinue 2fivar3&#61;$[ $a * $b ]echo " The result of $a * $b &#61; $var3"done
done
13.8 处理循环的输出

通过在done命令之后添加一个处理命令来实现将循环的输出使用管道或进行重定向

编写test23.sh脚本

#!/bin/bash
for (( a&#61;1;a<10;a&#43;&#43; ))
doecho "The number is $a"
done > test23.txt
echo "The command is finished"

编写test24.sh脚本

#!/bin/bash
for state in "North Dakota" Connecticut Illinois Alabama Tennessee
doecho "$state is the next plae to go"
done | sort
echo "This completes our travels"
13.9 实例

13.9.1 查找可执行文件

编写test25.sh脚本

#!/bin/bashIFS&#61;:
for folder in $PATH
doecho "$folder:"for file in $folder/*doif [ -x $file ]thenecho " $file"fidone
done

13.9.2 创建多个用户账户

编写test26.sh脚本

#!/bin/bash
input&#61;"users.csv"
while IFS&#61;&#39;,&#39; read -r userid name
doecho "adding $userid"useradd -c "$name" -m $userid
done <"$input"

编写users.csv文件

rich,Richard Blum
tim,Timothy Bresnahan
13.10 小结

bash shell提供了三种可用于脚本中的循环命令

for命令允许你遍历一系列的值
while命令提供基于命令条件的循环
until命令建立在命令或条件产生非零退出状态码的基础上



推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Shell中for命令的基本格式和用法,通过提供一个值列表来迭代执行一系列命令。同时还介绍了如何读取列表中的值,并给出了for命令与其他命令的结合使用示例。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
手机用户2602890925
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有