条件判断式

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)
!    反相状态

例题

使用者输入一个档名,程序判断:

  1. 这个文件是否存在,若不存在则给予一个『Filename does not exist』的信息,并中断程序;(命令排列)
  2. 若这个文件存在,则判断它是文件还是目录,结果输出『Filename is regular file』或 『Filename is directory』
  3. 判断当前用户对这个文件或目录所拥有的权限,并输出权限信息!
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