写脚本时,经常要判断字符串是否相等,检查文件状态或是数字测试等。Shell提供了对字符串、文件、数值及逻辑操作等内容的条件测试的支持。

 

格式:

test expression

[ expression ]            注意空格

` expression `

COMMAND

 

整数测试:

-gt

-lt

-ge

-le

-ne

-eq

[ 2 -gt 3 ]

 

NUM1=22

NUM2=17

 

[ $NUM1 -le $NUM2 ]

 

字符串测试:用两个中括号 ` `

>

<

>=

<=

!=

==

单目:

-z “abc”    测试是否为空

-n              测试是否不空

 

 

文件测试:

-e /path/to       exist

-f /path/to        普通文件 不包括目录

-d /path/to       目录

-r /path/to        读权限测试

-w /path/to      写权限

-x /path/to        执行权限

 

命令的逻辑的关系:

 

 

mkdir /tmp/abc

 

if 判断:

如果满足:

statement;

statement;

结束

 

双分支:

如果存在:

显示目录已经存在

否则:

创建目录;

说明创建成功;

结束

 

多分支

如果满足条件一:

语句;

如果满足条件二:

语句:

如果满足条件三:

语句

否则:

语句

结束

 

 

if 测试条件; then

statement1;

statemnet2;

fi

例:文件不存在创建:[ ! -e /tmp/abc ] && mkdir /tmp/abc

 

 

用户两个变量保存两个整数,在脚本中判断谁是大数,并显示出来;

 

NUM1, NUM2

 

if NUM1大于NUM2; then

显示NUM1是大数;

else

显示NUM2是大数;

fi

 

if [ $NUM1 -gt $NUM2 ]; then

echo “$NUM1 is the max number.”

else

echo “$NUM2 is the max number.”

fi

 

 

if /tmp目录下存在hello的文件;then

echo “hello已经存在;

else

创建此目录;

显示创建成功;

fi

 

if [ -e /tmp/hello ]; then

echo “/tmp/hello exists.”

else

mkdir /tmp/hello

echo “Create /tmp/hello successfully.”

fi

 

创建用户yellowdog

 

if yellowdog存在;then

说明此用户已经存在;

else

创建此用户;

添加密码

创建成功

fi

 

if id yellowdog; then

echo “A user.”

else

useradd yellowdog

echo “yellowdog” | passwd –stdin yellowdog

echo “Create a user yellowdog.”

fi

 

判断指定的路径对应文件的类型,如果是目录,如果是文件,否则,无法识别;

 

if 是目录;then

说明是目录;

elif 是文件;then

说明是文件;

else

说明天外来物;

fi

 

MYPATH=/etc/pam.d

 

if [ -d $MYPATH ]; then

echo “$MYPATH is a directory.”

elif [ -f $MYPATH ]; then

echo “$MYPATH is a common file.”

else

echo “An allien.”

fi

 

 

 

 

 

连接两个条件:

-a: 与关系;

-o: 或关系;

!: 非关系;

 

if [ $UID -ge 1 -a $UID -le 499 ]

 

 

给定一个用户帐号:

取出此用户的UID号;

如果UID=0,说明这是管理员;

如果UID>1并且UID<499,说明这是系统用户;

否则,说明这是普通用户;

 

 

使用命令取出用户的ID号,并保存至变量MYID中;

 

if ID号等于0; then

说明这是管理员

elif ID号大于等于1并且小于等于499;

说明这是系统用户

else

说明这是普通用户;

fi

 

 

MYID=`id -u user1`

 

if [ $MYID -eq 0 ]; then

echo “Admin.”

elif [ $MYID -ge 1 ] && [ $MYID -le 499 ]; then

echo “Sys user.”

else

echo “Common user.”

fi

 

 

 

 

glob: 文件名通配

*:

?:

[]:

 

 

 

 

一下是例子和练习:

 

写一个脚本:执行脚本,会打开一个非登录式shell,通常是当前shell的了shell进程;

1、创建目录/tmp/scripts

2、切换工作目录至此目录中

3、复制/etc/pam.d目录至当前目录,并重命令为test

4、将当前目录中的test及其里面的文件和子目录的属主改为redhat

5、将test及其子目录中的文件的其它用户的权限改为没有任何权限

 

 

 

 

写一个脚本:

1、显示当前系统日期和时间,而后创建目录/tmp/lstest

2、切换工作目录至/tmp/lstest

3、创建目录a1d, b56e, 6test

4、创建空文件xy, x2y, 732

5、列出当前目录下以a、x或者6开头的文件或目录;ls [ax6]*,  ls | grep “\<[ax6].*”

6、列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录;ls [a-zA-Z][0-9]*

 

练习:写一个脚本,完成以下功能

1、显示/var/目录下的所有文件或子目录,但要把所有字母换成大写;

2、以一个命令显示当前系统上所有可用shell对应的可执行文件的文件内容类型,并让结果以全大写的方式显示;

 

 

写一个脚本:

给定一个用户,想办法判断此用户是否已经登录进系统;

如果此用户登录到系统上了,就显示用户已经登录;

否则,说明此用户尚未登录;

 

写一个脚本:

给定一个用户,想办法判断此用户的UID跟其基本组GID是否一致;

如果一致,就将此用户的用户名添加至/tmp/goodusers,并显示这是个好人;

否则,就将此用户的用户名添加至/tmp/badusers,并显示此人是坏蛋;

 

写一个脚本,要求同上,但取出用户的ID号时不能使用id命令来实现;

 

写一个脚本:

给定一个文件,相办法判断此文件是否存在;

如果存在,就统计出此文件中的空白行的行数,并显示出来;

否则,就说明此文件路径有错误;

 

写一个脚本:

判断文件/etc/inittab文件中,是否有某一行中某个数字曾出现过至少三次;

如果有,显示这样的行共有多少个;

否则,显示没有这样的行;

 

 

 

 

 

if [ -x /usr/bin/id ]; then

         USER=”`id -un`”

         LOGNAME=$USER

         MAIL=”/var/spool/mail/$USER”

fi

 

 

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then

    INPUTRC=/etc/inputrc

fi

 

 

 

if ! echo $PATH | /bin/egrep -q “(^|:)$1($|:)” ; then

         if [ "$2" = "after" ] ; then

             PATH=$PATH:$1

         else

             PATH=$1:$PATH

         fi

fi

 

 

 

 

if [ -x /usr/bin/links ]; then

         httpget=”/usr/bin/links”;

elif [ -x /usr/bin/lynx ]; then

         httpget=”/usr/bin/lynx”;

fi

 

 

 

某文件存在时,就判断文件类型,不存在时,就说明此文件不存在;

 

if [ -e FILE ];then

if [ -f FILE ]; then

echo “common”

elif [ -d FILE ]; then

echo “dir”

else

echo “Unkown.”

fi

else

echo “Not exists.”

fi