当前位置: 首页 > Linux

Linux_《Linux命令行与shell脚本编程大全》Chapter13StudySummary

时间:2023-04-06 21:23:39 Linux

时间:2017-09-13周三注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十三章学习总结第十三章:更多结构命令本章内容for循环语句unt迭代语句使用while语句循环重定向循环输出13.1for命令格式forvarinlistdo命令done命令注:变量var为迭代列表中的值,以及在do和done语句之间输入的命令可以是一个或多个标准bashshell命令。13.1.1读取列表中的值for命令最基本的用法是遍历for命令本身定义的一系列值,在其中编写test1.sh脚本#!/bin/bashfortest三四五六doecho"下一个数字是$test"donewritetest1b.shscript#!/bin/bashfortestinOne三四五六doecho"下一个数字是$test"donecho"最后一个数字是$test"test=Sevenecho"Now,Testnumberis$test"13.1.2读取列表中的复杂值for循环假设每个值之间用空格隔开当值有特殊字符时,需要转义可以使用escape字符(反斜杠)和双引号当值中包含空格时,需要使用双引号编写test2.sh脚本#!/bin/bashfortestinIdon\'tknow"this'll"workdoecho"word:$test"完成写入test3。shscript#!/bin/bash用于在内华达州“新罕布什尔州”“新墨西哥州”“纽约州”进行测试doecho“Nowgoingto$test”done13.1.3readlistfromvariablewritetest4.shscript#!/bin/bashlist="OneTwoThree"list=$list"Four"fornumberin$listdoecho"Thenumberis$number"done13.1.4Readingvaluesfromacommand在列表中生成所需值的另一种方法是使用命令的输出可以活命令替换任何产生输出的命令,然后使用命令的输出在for命令中写入数字文本OneTwoThree写入test5.sh脚本#!/bin/bashfile="number"fornumberin$(cat$file)doecho"Thenumberis$number"done13.1.5更改字段分隔符bashshell会将空格/制表符/换行符视为字段分隔符使用换行符作为字段分隔符IFS=$'\n'那么bashshell将忽略空格和制表符也可以自定义使用特定字符作为字段分隔符写test5b.sh脚本#!/bin/bashfile="number"IFS=$'\n'fornumberin$(cat$file)doecho"Thenumberis$number"done13.1.6使用通配符读取目录可以使用for命令自动遍历目录下的文件写入test6.sh脚本#!/bin/bashfor文件在/home/zc/test/unit13/*doif[-d"$file"]然后echo"$file是一个目录"elif[-f"$file"]然后echo"$file是一个文件"fidonewritetest7.shscript#!/bin/bashforfilein/home/zc/test/unit13/*.sh/home/zc/test/unit12doif[-d"$file"]thenecho"$fileisadirectory"elif[-f"$file"]thenecho"$fileisafile"fidone13.2Clanguagestyleforcommand13.2.1ClanguageforcommandClanguageforformatfor(i=0;i<10;i++){printlf("Thenextnumberis$d\n",i);}bash中的C风格for循环格式for((变量赋值新台币;健康)状况;迭代过程))变量赋值可以有空格条件中的变量不能以美元符号开头迭代过程的计算公式没有写成expr命令格式test8.sh脚本#!/bin/bashfor((i=1;i<=10;i++))doecho"Thenextnumberis$i"done13.2.2编写带有多个变量的test9.sh脚本#!/bin/bashfor((a=1,b=10;a<=10;a++,b--))doecho"$a-$b"done13.3while命令13.3.1while命令格式whiletest命令的基本格式doothercommandsdone命令说明while命令和if-then语句中定义的测试命令格式完全一样。while命令的关键是指定测试命令的退出状态码必须随着循环中运行的命令而改变。如果退出状态码没有改变,while循环就会一直继续下去。编写test10.sh脚本#!/bin/bashvar1=10while[$var1-gt0]doecho$var1var1=$[$var1-1]done13.3.2使用多个测试命令while命令允许您在while语句中仅定义多个测试条件lasttest会根据条件的退出状态来决定何时结束循环注意每条测试命令单独一行写test11.sh脚本#!/bin/bashvar1=10whileecho$var1[$var1-ge0]doecho"Theisinsidetheloop"var1=$[$var1-1]done13.4untilcommand命令格式until测试命令a通常返回一个退出状态码非零的测试命令bashshell仅当测试命令的退出状态码不为0时,bashshell才会执行循环中列出的命令。一旦测试命令返回退出状态码为0,循环结束。编写测试12。shscript#!/bin/bashvar1=100until[$var1-eq0]doecho$var1var1=$[$var1-25]donewritetest13.shscript#!/bin/bashvar1=100untilecho$var1[$var1-eq0]doecho循环内部:$var1var1=$[$var1-25]done13.5嵌套循环循环语句可以在循环中使用任何类型的命令,包括其他循环命令Writetest14.shscript#!/bin/bashfor((a=1;a<=3;a++))doecho"Startingloop$a:"for((b=1;b<=3;b++))doecho"Insideloop:$b"doneonewritetest15.shscript#!/bin/bashvar1=5while[$var1-ge0]doecho"Outerloog:$var1"for((var2=1;$var2<3;var2++))dovar3=$[$var1*$var2]echo"Innerloop:$var1*$var2=$var3"donevar1=$[$var1-1]donescripttest16.sh#!/bin/bashvar1=3until[$var1-eq0]doecho"Outerloop:$var1"var2=1while[$var2-lt5]dovar3=$(echo"scale=4;$var1/$var2"|bc)echo"Innerloop:$var1/$var2=$var3"var2=$[$var2+1]donevar1=$[$var1-1]done13.6循环处理文件数据通常要遍历文件中存储的数据,这需要结合下面的技术实现现在使用嵌套循环:再次使用循环读取每一行中的数据修改IFS环境变量:强制for命令将文件中的每一行视为一个单独的条目13.7控制循环13.7.1break命令使用break命令来退出任何类型的循环,包括while和until循环1.跳出单个循环并编写test17.shscript#!/bin/bashforvar1in12345678910doif[$var1-eq5]thenbreakfiecho"Iterationnumber:$var1"doneecho"Theforloopiscompleted"writetest18.shscript#!/bin/bashvar1=1while[$var1-lt10]doif[$var1-eq5]thenbreakfiecho"Iteration:$var1"var1=$[$var1+1]doneecho"while循环完成"2.跳出内循环,编写test19.sh脚本#!/bin/bashfor((a=1;a<4;a++))doecho"Outerloop:$a"for((b=1;b<100;b++))doif[$b-eq5]thenbreakfiecho"Innerloop:$b"doneone3.跳出外层循环写test20.sh脚本#!/bin/bashfor((a=1;a<4;a++))doecho"Outerloop:$a"for((b=1;b<100;b++))doif[$b-gt4]thenbreak2fiecho"Innerloop:$b"doneone13.7.2continue命令写入test21.shscript#!/bin/bashfor((var1=1;var1<15;var1++))doif[$var1-gt5]&&[$var1-lt10]thencontinuefiecho"Iterationnumber:$var1"donewritetest22.shscript#!/bin/bashfor((a=1;a<=5;a++))doecho"Iteration$a:"for((b=1;b<3;b++))doif[$a-gt2]&&[$a-lt4]thencontinue2fivar3=$[$a*$b]echo"$a*$b=$var3"doneone13.8处理循环的结果通过在done命令后添加处理命令实现输出。使用管道或重定向循环的输出来编写test23.sh脚本#!/bin/bashfor((a=1;a<10;a++))doecho"Thenumberis$a"done>test23.txtcho“命令完成”为“北达科他州”康涅狄格州伊利诺伊州阿拉巴马州田纳西多州的州编写test24.sh脚本#!/bin/bashecho“$state是下一个要走的地方”done|sortecho"Thiscompletesourtravels"13.9示例13.9.1查找可执行文件编写test25.sh脚本#!/bin/bashIFS=:forfolderin$PATHdoecho"$folder:"forfilein$folder/*doif[-x$文件]thenecho"$file"fidoneone13.9.2创建多个用户账户Writetest26.shscript#!/bin/bashinput="users.csv"whileIFS=','read-ruseridnamedoecho"adding$userid"useradd-c"$name"-m$useriddone<"$input"Writeusers.csvfilerich,RichardBlumtim,TimothyBresnahan13.10总结bashshell提供了三个可以在脚本中使用的循环命令for命令可以让你遍历一系列ofwhile命令的值提供了一个基于命令条件的循环,直到命令建立在命令或条件上产生非零退出状态代码