首先,判断文件是否为目录;如果不是目录,则判断文件是否存在;如果文件存在,则判断文件是否具有读写执行的权限,通过则显示 echo 语句;以上所有判定都不通过时,显示 echo 语句。
可以使用逻辑操作符连接带参数的判断语句,也可以使用逻辑操作符将表达式和 shell 命令组合在一起。
case 也是一个流程控制结构,shell 中的 case 语句可以依据可包含通配符的模式测试字符串。通常可以使用 if-elif 语句配合 test 实现同样的功能,但是当选择数目过多时,就会体现出语句太长的局限性。
从语法中可以看出,任何 pattern 之间都可以由 | 分割的几个模式组成,这种情况下 expression 匹配其中任意一个模式则执行相应语句。模式匹配按顺序依次执行,知道匹配上为止,如果无法匹配,则不执行任何操作。
case 语句与 fi 语句一样,结束时是通过字符串颠倒(reverse)。
判断文件后缀,根据不同后缀选择不同的读取方式,最后一个 * 匹配所有其他匹配不上的形式,相当于 C 语言中的 default。
循环可以控制某些代码的重复行为或允许对多个对象操作。
for 循环用于遍历整个对象/数字列表,依次执行每个独立对象/数字的循环内容,在 shell 脚本里,对象可以是命令行参数、文件名或者任何可以以列表格式建立的东西。
list 为名称列表,在 for 循环中对名称列表中的每个对象进行相应操作,可以通过命令/模式匹配等操作来获取名称列表。
两个例子都可以遍历 mp3 文件并且依次播放。但是使用 find 命令会层层深入文件夹依次查找,而直接列出只会包含当前目录的文件夹。执行反单引号(``)之前的命令,引用结果作为字符串。for 循环中如果 in list 参数被省略,则默认为 in "$@",即命令行参数的引用列表。
shell 中的 while 和 until 循环与传统语言中的 while 和 do/until 相似,它们允许代码在某些条件为真(或直到为真)时重复运行。while 与 until 唯一的区别在于如何判断 condition 的退出状态。在 while 语句中当 condition 的退出状态为真时循环继续运行,否则退出循环;而 until 语句中当 condition 的退出状态为真时循环退出,否则继续运行。它们中的 condition,可以是简单的命令/列表,或者是包含 && 或 || 连接的命令,与 if 语句中的 test 一样。
在 shell 中经常使用 while true 或者 until false 来构建无限循环。continue 语句用于在循环体中提早开始下一轮循环,break 语句用于跳出整个循环,而 continue 与break 语句也弥补了 shell 中没有 goto 的不足。在多层循环中,continue n 表示会把 n 层的剩余代码都去掉,break n 表示退出 n 层循环。