在理解选择结构语句之前,我们先看看几个有意思的bash编程变量进阶替,这些进阶的替换在很多时候能给我们带来快捷方便的处理方式。

一、bash编程之变量替换的进阶

1、${parameter:-word}

  当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.  

2、${parameter:=word}

  若变量未定义或者值为空时,在返回word的值的同时将word赋值给value  

3、${parameter:?word}

  若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)

4、${parameter:+word}

  若变量以赋值的话,其值才用word替换,否则不进行任何替换

5、${parameter#*word}

  ${parameter##*word}

  去掉parameter中与word相匹配的部分,条件是parameterword相匹配从开头开始,#与##的区别在于#是最短匹配模式,##是最长匹配模式.  

6、${parameter%word*}

  ${parameter%%word*}

   去掉parameter中与word相匹配的部分,条件是parameterword相匹配从尾部 开始,%与%%的区别在于%是最短匹配模式,%%是最长匹配模式.

eg:

1、FILE=/usr/local/src

${FILE#*/}: usr/local/src

${FILE##*/}: src

${FILE%/*}: /usr/local

${FILE%%/*}:


二、if选择语句

  1、单分支if语句

  if 条件 ;then

     语句1

     语句2

     ···

  fi

eg:

2、写一个脚本,实现如下功能:

如果设备/dev/sda3已经挂载,就显示其挂载点

#!/bin/bash
#
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
  mount | grep "/dev/sda3" | cut -d' ' -f3
fi


 2、双分支if语句

  if 条件 ;then

     语句1

     语句2

     ···

  else

     语句1

     语句2

     ···

  fi

eg:

3、给定一个用户,如果其UID等于GID,就说明这是个“good guy”,否则,“Bad guy.”

#!/bin/bash
#
UserName=user1
if [ `id -u $UserName` -eq `id -g $UserName` ]; then
  echo "Good Guy."
else
  echo "Bad Guy."
fi


 3、多分支if语句

  if 条件1 ;then

     语句1

     语句2

     ···

elif 条件2 ;then

     语句1

     语句2

     ···

else

     语句1

     语句2

     ···

 fi

eg:

4、写一个脚本,能接受参数gzip、bzip2或xz,而后能将/etc/目录备份至/backup目录,并以参数指定的形式压缩存放;文件名称包含脚本执行时刻的时间;

#!/bin/bash
#
Com=$1
if [ -z $Com ]; then
  Com=gzip
fi
[ -d /backup ] || mkdir /backup
if [ $Com == 'gzip' ]; then
  tar zcf /backup/etc-`date +%F-%H-%M-%S`.tar.gz /etc/*
  [ $? -eq 0 ] && echo "Backup etc finished.(gzip)."
elif [ $Com == 'bzip2' ]; then
  tar jcf /backup/etc-`date +%F-%H-%M-%S`.tar.bz2 /etc/*
  [ $? -eq 0 ] && echo "Backup etc finished.(bzip2)."
elif [ $Com == 'xz' ]; then
  tar Jcf /backup/etc-`date +%F-%H-%M-%S`.tar.xz /etc/*
  [ $? -eq 0 ] && echo "Backup etc finished.(xz)."
else
  echo "Usage: `basename $0` {[gzip|bzip2|xz]}"
  exit 6
fi

三、case选择语句

case ${ } (变量引用)in

value1)

  语句1

  语句2

  ···

  ;;

value2)

  语句1

  语句2

  ···

  ;;

value3)

  语句1

  语句2

  ···

 ;;

*)

  语句1

  语句2

  ···

 ;;

esac

eg:


5、写一个脚本

1)、显示如下菜单给用户:

m|M) show memory usages;

d|D) show disk usages;

q|Q) quit

2)、如果用户选择了第一项,则显示内存使用信息;

  如果选择了第二项,则显示磁盘挂载及使用相关信息;

  如果是第三项,退出,并显示选择退出;

  其它任何内容,均说明错误选项;

#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice: " Choice
case $Choice in
m|M)
    free -m ;;
d|D)
    df -lh ;;
q|Q)
    echo "Quit..."
    exit 0
    ;;
*)
    echo "Invalid input."
    exit 5
    ;;
esac