条件判断式
test命令
文件的存在性测试
-e 文件是否存在 (常用) -f 文件是否存在且为文件(file) (常用) -d 文件是否存在且为目录(directory) (常用) -b 文件是否存在且为一个block device 文件 -c 文件是否存在且为一个character device 文件 -S 文件是否存在且为一个Socket 文件 -p 文件是否存在且为一个FIFO (pipe) 文件 -L 文件是否存在且为一个链接文件
文件的权限测试
-r 检测该文件是否存在且具有『可读』的权限 -w 检测文件是否存在且具有『可写』的权限 -x 检测文件是否存在且具有『可运行』的权限 -u 检测文件是否存在且具有『SUID』的属性 -g 检测文件是否存在且具有『SGID』的属性 -k 检测文件是否存在且具有『Sticky bit』的属性 -s 检测文件是否存在且为『非空白文件』
文件的新旧测试
-nt (newer than)判断两个文件到底哪一个文件要新 -ot (older than)判断两个文件哪个文件要旧 -ef 判断两个文件是否为同一文件,可用于判断硬链接文件
数值大小测试
关于两个整数之间的判定:
-eq 测试两数值是否相等(equal) -ne 测试两数值是否不等(not equal) -gt 测试前一个数值n1 是否大于后一个数值n2 (greater than) -lt 测试n1 是否小于n2 (less than) -ge 测试n1是否 大于等于n2 (greater than or equal) -le 测试n1是否 小于等于n2 (less than or equal)
字符串测试
-z 用于测试字符串长度是否为0,若字符串为空,则返回true -n 用于测试字符串长度是否为非0,若字符串为非空,则返回true = 用于判断两个字符串是否相等,若相等则返回true != 用于判断两个字符串是否不相等,若不相等,则返回true (等号或不等号两边必须要有空格)
多重条件判定
-a 两种情况同时成立时才回传true (and) -o 两种情况任何一个成立就可回传true (or) ! 反相状态
例题
使用者输入一个档名,程序判断:
- 这个文件是否存在,若不存在则给予一个『Filename does not exist』的信息,并中断程序;(命令排列)
- 若这个文件存在,则判断它是文件还是目录,结果输出『Filename is regular file』或 『Filename is directory』
- 判断当前用户对这个文件或目录所拥有的权限,并输出权限信息!
1. 让使用者输入文件名,并且判断使用者是否真的有输入字串? echo -e "Please input a filename, I will check the filename's type and permission. \n\n" read -p "Input a filename : " filename test -z $filename && echo "You MUST input a filename." && exit 0 2. 判断文件是否存在?若不存在则显示信息并结束脚本 test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0 3. 开始判断文件类型与属性 test -f $filename && filetype="regulare file" test -d $filename && filetype="directory" test -r $filename && perm="readable" test -w $filename && perm="$perm writable" test -x $filename && perm="$perm executable" 4. 开始输出 echo "The filename: $filename is a $filetype" echo "And the permissions are : $perm"
条件判断符
中括号判断符: []
能实现和test命令一样的功能;
为了与通配符区分,各元素间均有空格;
条件结构化命令
if-else
单层条件结构化命令
if [条件判断式 ]; then 语句1 else 语句2 fi
多层条件结构化命令
if [ 条件判断式1 ]; then 语句1 elif [ 条件判断式2 ]; then 语句2 else 语句3 fi
case命令
格式
case <变量> in <字符串1> ) {<命令清单1>};; ... <字符串n> ) {<命令清单n>};; *) {其他命令};; esac
例题
写一个shell脚本命名为capital,要求运行程序时输入国家名字,程序能输出这个国家的首都。
#!/bin/bash case $1 in China) echo Beijing;; USA) echo Washington;; British) echo London;; Russia) echo Moskow;; *)echo Out of my knowledge;; esac
循环结构化命令
for循环语句
语法一
for((变量赋值; 条件判断; 变量迭代)) do 语句块1 done
编写一个程序,打印乘法公式
#!/bin/bash for((i=1; i<10; i++)) do for((j=1; j<=i; j++)) do echo -n “$j*$i=$(($i*$j)) ” if [ $i -eq $j ] then echo $‘\n’ fi done done
语法二
for var in item1 item2 … itemN do 语句块1 done
取值列表是变量
list=“beijing tianjing shanghai guangzhou” list=$list” ***” for scenery in $list do echo “Have you visited $scenery?” done * Have you visited beijing? Have you visited tianjing? Have you visited shanghai? Have you visited guangzhou? Have you visited ***?
取值列表存在文件中
while循环语句
while [ 条件判断式 ] do 语句块1 done
当用户输入break或者BREAK才结束程序执行,否则就一直告知用户输入字符串,并将用户输入字符串输出
#!/bin/bash while [ "$yn" != “break" -a "$yn" != “BREAK" ] do read -p “Please input a string : (break/Break to stop) " yn echo You input a string : $yn done echo "OK! you interrupt the program."
编写猜字游戏,当用户输入指定的字符串后才结束游戏,否则就一直告知用户再试一次
#! /bin/bash while true do read -p $’Guess word\n ( Tips : The word consists of four blocks, the first word is “g”, the last word is “d”)\n’ word if [ $word != “good” ] then echo “Try again!” else echo “Bingo, you are right!” break fi done