条件判断式
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
ficase命令
格式
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
京公网安备 11010502036488号