Shell脚本中的if、case、for、while、until
if条件测试语句
- if-then-fi
if条件测试语句中会运行if后面的那个命令(判断式)。
如果该命令的退出状态码是0,位于then部分的命令才会被执行。
如果该命令的退出状态码是其他值,then部分的命令就不会被执行(if后面的命令仍被执行)。
双括号(()):除了test命令使用的标准数学运算符外,还允许比较过程中使用高级数学表达式,双括号命令提供了更多的数学符号。格式:(( 数学赋值或比较表达式 ))。
双括号命令符号
符号 | 描述 |
val++ | 后增 |
val-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 按位求反 |
** | 幂运算 |
<< | 左移 |
>> | 右移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 逻辑和 |
|| | 逻辑或 |
shell中各种括号的作用()、(())、[]、[[]]、{}: <http://blog.csdn.net/taiyang1987912/article/details/39551385>
shell中$(( )) 与 $( ) 、${ }的区别: <https://www.cnblogs.com/xunbu7/p/6187017.html>
shell中$(( ))、$( )、``与${ }的区别: <http://blog.csdn.net/number_0_0/article/details/73291182>
双中括号[[]]:提供了针对字符串比较的高级特性(模式匹配)。在模式匹配中,可以定义一个正则表达式来匹配字符串值。
- if-then-else-fi
- if-then-elif--then-else-fi
[ "$yn" == "Y" ] || [ "$yn" == "y" ] (布尔逻辑将可能的返回值简化为TRUE或FALSE类型)
也可写成 [ "$yn" == "Y" -o "$yn" == "y" ]
if条件测试语句混合shell脚本参数的使用
case条件测试语句
- case-in-esac
case命令会将指定的变量与不同模式进行比较。如果变量和模式是匹配的,那么shell会执行为该模式指定的命令。可以通过|竖线操作符在一行中分隔出多个模式。*星号会捕获所有与已知模式不匹配的值。
for条件循环语句
- for-do-done
亦可写成for var in list; do
- 第一次循环时,$var的内容为con1;
- 第二次循环时,$var的内容为con2;
- 第三次循环时,$var的内容为con3;
- ……
$animal变量保持了其值,也允许我们修改它的值,并在for命令循环之外跟其他变量一样使用。
当for循环的列表值中出现了单引号',shell会尝试使用它们来定义一个单独的数据值。若希望正常输出单引号',须另外使用转义字符(反斜线\)将单引号转义,或使用双引号""来定义用到单引号的值。
for循环假定列表中的每个值都是用空格分割的。如果在单独的数据值中有空格,就必须使用双引号将这些值括起来(在某个值两边使用双引号时,shell并不会将双引号当成值的一部分)。
从变量读取列表
从命令读取值
users.txt文件中每一行有一个值,故每个值不是通过空格分隔的。for命令以每次一行的方式遍历了cat命令的输出。
若某一行中的值存在空格字符,for命令仍会将这个值按空格分割成多个。此时须更改内部字段分隔符(internal field separator)IFS环境变量。默认情况下,bash shell会将空格、制表符、换行符当作字段分隔符,即若数据中存在这三种字符的任一,bash shell就会假定为一个新数据字段的开始。要解决这个问题,可以在shell脚本中临时更改IFS环境变量的值来限制被bash shell当作字段分隔符的字符(IFS=$'\n')。
SHEll中的IFS详解: <http://smilejay.com/2011/12/bash_ifs/>
Shell中的IFS解惑: <http://blog.csdn.net/whuslei/article/details/7187639>
带空格的文件目录如何处理?: <http://bbs.chinaunix.net/thread-4141351-1-1.html>
若按照默认IFS的值,"dayo y"会分割成"dayo"和"y"两个数据处理。
假定要遍历一个文件中用冒号分隔的值(比如在/etc/passwd文件中),需要将IFS的值设为冒号
IFS=:
如果要指定多个IFS字符,只要将它们在赋值行串起来就行。
IFS=$'\n':;"
这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。
IFS=$'\n',IFS="\n" or IFS='\n'差别: <http://bbs.chinaunix.net/thread-1748468-1-1.html>
IFS=$'\n'的确切意义: <http://www.it1352.com/321270.html>
- C语言风格的for循环命令(数值处理)
- 初始值:某个变量在循环当中的初始值;
- 限制值:当变量的值在这个限制值的范围内,就继续进行循环;
- 执行步长:每做一次循环时变量的变化量。
shell循环变量传递问题: <http://blog.csdn.net/u012823211/article/details/51087201>
shell循环中变量的作用域问题: <http://blog.csdn.net/ls4034/article/details/76005929>
while条件循环语句
- while-do-done
可以在while语句行定义多个测试命令,每个测试命令须出现在单独的一行上。但只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。在含有多个命令的while语句中,在每次迭代中所有的测试命令都会被执行,包括测试命令失败的最后一次迭代。
until条件循环语句
- until-do-done:当condition条件成立时,才终止循环,否则就持续进行循环的程序段。即只有测试命令的退出状态码不为0,bash shell才会执行循环中列出的命令;一旦测试命令返回了退出状态码0,循环结束。
until循环中同样可以使用多个测试命令,规则与while循环类似,即只有在最后一个命令成立时停止。
实例练习:
- 嵌套循环、修改IFS环境变量以及输出的处理:循环处理/etc/passwd文件的数据,并重定向输出到usersoutput.txt文件中(同时也支持管道命令的处理)
- 指定格式从文件中获取测试条件:创建多个用户,根据输入文件users.csv的格式修改IFS,通过read命令获取变量、useradd命令添加新用户
控制循环break、continue命令(适用于for、while、until循环中,用法与作用与C语言类似,不作演示)
- break n:n指定要跳出的循环层级。默认情况下,n为1,表明跳出的是当前循环。若将n设为2,break命令就会跳出下一级的外部循环。
- continue n:n指定要中止的循环层级。默认情况下,n为1,表明中止的是当前循环。若将n设为2,continue命令就会中止下一级的外部循环。