shell if语句实例精讲
if 结构允许根据命令的成功与否执行不同的行为。
if 命令语法:
如果对某个要素primaries, FILE 参数是 /dev/fd/N 这样的形式,那么就检查文件描述符 “N”。stdin, stdout 和 stderr 和他们各自的文件描述符也可以用于测试。
1.1 if表达式
下表包含了一个组成 TEST-COMMAND 命令或者命令列表,称作 “要素primaries” 的概览。这些primaries放置在方括号中来表示一个条件表达式的测试。
表 1.1. 主表达式
表达式可以借以下操作符组合起来,以降序列出:listed in decreasing order of precedence:
表 1.2. 组合表达式
1.2. 后接then语句的命令
CONSEQUENT-COMMANDS 列出了跟在 then 语句后面可以是任何有效的UNIX命令,任何可执行的程序,任何可执行的shell脚本或者任何shell语句,除了 fi. 。重要地记住 then 和 fi 在shell里面被认为是分开的语句。因此,在命令行上使用的时候,他们用分号隔开。
在脚本中,if语句的不同部分通常是良好分隔的。以下是一些简单的例子:
1.3. 检查文件
第一个例子检查一个文件是否存在:
anny ~> cat msgcheck.sh
#!/bin/bash
echo "This scripts checks the existence of the messages file."
echo "Checking..."
if [ -f /var/log/messages ]
then
echo "/var/log/messages exists."
fi
echo
echo "...done."
anny ~> ./msgcheck.sh
This scripts checks the existence of the messages file.
Checking...
/var/log/messages exists.
...done.
1.4. 检查shell选项
加入到你的Bash配置文件中去:
# These lines will print a message if the noclobber option is set:
if [ -o noclobber ]
then
echo "Your files are protected against accidental overwriting using redirection."
fi
[注意] 环境
以上的例子将在命令行输入后开始工作:
anny ~> if [ -o noclobber ] ; then echo ; echo "your files are protected
against overwriting." ; echo ; fi
your files are protected against overwriting.
anny ~>
然而,如果使用依赖环境的测试,当在脚本中输入相同的命令可能得到不用的结果,因为脚本会打开一个新的,没有设置预期的变量和选项的shell。
1.2. if的简单应用
1.2.1. 测试退出状态
变量包含了之前执行命令的退出状态(最近完成的前台进程)。
以下的例子显示了一个简单的测试:
anny ~> if [ $? -eq 0 ]
More input> then echo 'That was a good job!'
More input> fi
That was a good job!
anny ~>
以下的例子证明了 TEST-COMMANDS 可以是任何有返回和退出状态的UNIX命令,之后 if 再次返回零的退出状态:
anny ~> if ! grep $USER /etc/passwd
More input> then echo "your user account is not managed locally"; fi
your user account is not managed locally
anny > echo $?
0
anny >
以下能得到同样的结果:
anny > grep $USER /etc/passwd
anny > if [ $? -ne 0 ] ; then echo "not a local account" ; fi
not a local account
anny >
7.1.2.2. 数字的比较
数值的比较:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
you've worked hard enough for today.
anny >
这个shell脚本在每个星期天由cron来执行。如果星期的数是偶数,提醒你把垃圾箱清理:
#!/bin/bash
# Calculate the week number using the date command:
WEEKOFFSET=$[ $(date +"%V") % 2 ]
# Test if we have a remainder. If not, this is an even week so send a message.
# Else, do nothing.
if [ $WEEKOFFSET -eq "0" ]; then
echo "Sunday evening, put out the garbage cans." | mail -s "Garbage cans out" your@your_domain.org
1.2.3. 字符串比较
一个通过比较字符串来测试用户ID的例子:
使用Bash,你可以缩短这样的结构。下面是以上测试的精简结构:
类似于如果测试为真就执行的 “&&” 表达式, “||” 指定了测试为假就执行。类似于 “&&” 表达式指明了在两个测试条件为真时所采取的动作,“||” 指明测试为假时所采取的行动。
正则表达式也可以在比较中使用:
anny > gender="female"
anny > if [[ "$gender" == f* ]]
More input> then echo "Pleasure to meet you, Madame."; fi
Pleasure to meet you, Madame.
anny >
[注意] 真正的程序员
多数程序员更喜欢使用和方括号相同作用的内建的 test 命令,像这样:
参见信息页面得到更多关于Bash “(( EXPRESSION ))” 和 “[[ EXPRESSION ]]” 结构的模块匹配信息。
shell if 命令参数说明
比较字符写法:
一个简单的挂载硬盘脚本,linuxjishu/9952.html target=_blank class=infotextkey>mount_disk.sh(windows下的ntfs格式硬盘)
#! /bin/sh
dir_d=/media/disk_d
dir_e=/media/disk_e
dir_f=/media/disk_f
a=`ls $dir_d | wc -l`
b=`ls $dir_e | wc -l`
c=`ls $dir_f | wc -l`
echo "checking disk_d..."
if [ $a -eq 0 ]; then
echo "disk_d is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/software /media/disk_d
else
echo "disk_d exits"
fi
echo "checking disk_e..."
if [ $b -eq 0 ]; then
echo "disk_e is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/elitor /media/disk_e
else
echo "disk_e exits"
fi
echo "checking disk_f..."
if [ $c -eq 0 ]; then
echo "disk_f is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/work /media/disk_f
else
echo "disk_f exits"
fi