Shell编程――条件判断

条件测试类型

① 整数测试

② 字符测试

③ 文件测试

表达式:[ expression ] [[ expression ]] test expression

注:表达式和[  ]之间一定要有空格

整数比较:

    -eq :测试两个整数是否相等,如[ $A eq $B ],相等为真,不等为  假。

    -ne : 测试两个整数是否不相等,不相等为真,相等为假。

    -gt : 测试一个整数是否大于另一个,大于为真,小于等于为假。

    -lt : 测试一个整数是否小于另一个,小于为真,大于等于为假。
    -ge:测试一个整数是否大于等于另一个整数,大于等于为真,小 于为假。

    -le:测试一个整数是否小于等于另一个整数,小于等于为真,大 于为假。

逻辑与:&&

逻辑或:||

例:如果用户user不存在,就添加用户。

#   !id user && useradd user

或者id user  ||  useradd user (注:逻辑与前面为真后面命令不执行)

 

变量命名规则:

    1 只能包含字母、数字和下划线,并且不能以数字开头;

    2 不应该和系统中已有的环境变量重名

    3 做到见名知意 

例:如果/etc/inittab大于100行,则是大文件。

#!/bin/bash

LINES=`wc l /etc/inittab`

#echo $LINES

FINLINES=`echo $LINES|cut   f1`

#echo $FINLINES

[ $FINLINES gt 100 ] && echo “it is a big file ! || echo it is a small file !

 

例:如果用户不存在,添加用户并且设定密码;否则,显示用户已  存在。

! id  user1  &&  useradd  user1  &&  echo  “user |passwd stdin user1  ||  echo user1 is existing!

脚本实现

#!/bin/bash 

read -p "Enter userID: " ID

! id $ID && useradd $ID && echo $ID | passwd --stdin $ID ||echo "$ID is existing !"

可以加入/dev/null

 

自我练习:

#!/bin/bash

if [ $# -ne 2 ];then

echo  ‘参数错误!‘

exit 3

fi

if [ $1  eq $2 ];then

echo $1 等于$2

exit 4

fi

if [ $1 gt $2 ];then

echo $1大于$2

exit 5

fi

if [ $1 lt $2 ];then 

echo $1小于$2

exit 6

fi

 


单分支if语句:

if 条件判断 ; then

statement1

statement2

……

fi

双分支的if语句:

if 判断条件 ;then

statement1

……

else

statement2

……

fi

例:如果用户UID0,那么现实为管理员,否则,现实为普通用户。

#!/bin/bash

NAME=users#改为read �p “ID” NAME 实现交互

If

[ `id u $NMAE` -eq 0 ]

then

echo Adminitrator!

else

echoCommon user!

fi

增加判断用户是否存在:

#!/bin/bash

read -p "ID:" NAME

if

[ `id -u $NAME` ]#注意要加反引号!或者直接写成   id �u $NAME

then

if

[ `id -u $NAME` -eq 0 ]

then

echo "Admin"

else

echo "Common user"

fi

else 

echo " This user not exist!"

fi

shell中进行算术运算:

l、let   如 let C=$A+$B

2、$[ $A+$B ]

3、$(($A+$B))

4、expr如C=`expr $A+$B`

exit :退出脚本。exit后面可以加数字0-255之间。如果没有定义命

令状态码,就是exit后面的数字。那么最后执行的命令的状态

码即为脚本的状态码。

if ……;then如果if后面不加[ ],那么if直接判断状态码,如

ifgrep ……。

文件测试:

-e file:测试文件是否存在

-f file:测试文件是否问普通文件

-d file:测试指定路径是否为目录

-r file:测试文件对当前用户是否有读权限

-w file:测试文件对当前用户是否有写权限

-x file:测试文件对当前用户是否有执行权限

 

 

例:如果文件不存在则推出脚本

#!/bin/bash

FILE=/etc/inittab

if [ ! e $FILE ];then

echo NO FILE!

exit 8

fi

多分支if语句:

if 判断1then

statement1

……

elif 判断2then

statement2

……

elif ……

else 

statement N

fi

例:输入一个文件路径,测试文件是否存在。

#!/bin/bash

if  [ $# -lt 1 ] || [ $# -gt 1 ];then 

echo  “NO Parameters !

exit  7

fi

if[-e $1];then

echoOK!

else

echoNO Files !

fi

 

shift : 轮替 后面可加数字,表示轮替多少个

例:

#!/bin/bash

echo $1

shift

echo $1

执行:./X.sh12

显示结果为:1

2

若改成shift 2

./X.sh1 2 3

则显示: 1

3

 

 

 

字符测试:

== 是否相等,相等为真

!=是否不相等,不相等为真

>大于

<小于

-z string :测试指定字符串是否为空,空则真

-n string:测试指定字符串是否为不空,不空为真

例:[ `id u $1` == `id g $1`]

 

bc:计算器

 scale=N ,表示保留几位精度

例: echo scale=2;111/22; |bc

或者 bc <<< scale=2;111/22;”

 

:传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果保留两位精度。

#!/bin/bash

 echo `bc <<< scale=2;$!$2$3`

 

例:传递三个参数给脚本,参数均为用户名,将这些用户的账号信息提取出来放置于/tmp/test中,并且需求每一行行首有行号。

egrep $1|$2|$3 /etc/passwd >>/tmp/a

cat n /tmp/a > /tmp/test

rm rf a

 

shell循环:要有进入条件,退出条件:forwhileuntil

 

1 for 变量 in 列表 ;do

循环体

done 

 

生成列表:{ 1..N}`seq 起始数 步进数 结束数

declare :声明变量类型

-i :整型

-x:声明为环境变量

 

例:求1100的和

 

#!/bin/bash

declare  -i SUM=0

for I in {1..100};do

 SUM=$[$SUM+$I]

done

echo “The SUM is :$SUM

 

例:比较三个数的大小

echo -n "Enter three number:"

read a b c

if [ $a -gt $b ];then

  t=$a;a=$b;b=$t;

fi

 

if [ $a -gt $c ];then

  t=$a;a=$c;c=$t;

fi

 

if [ $b -gt $c ];then

  t=$b;b=$c;c=$t;

fi

 

echo "From small to big:$a,$b,$c"

 

:给每个用户发送hello

#!/bin/bash

for I in `cat /etc/passwd|cut �d: -f1` ;do

echo “hello,$I”

done

 

依次/etc/passwd中的每个用户问好,并显示对方的shell,只想默认shellbash的用户问好

#!/bin/bash

for I in `cat /etc/passwd |grep 'bash'`;do

echo "hello `echo $I |cut -d: -f1` your bash"

done

:添加10用户user1~user10密码同用户名,要求只有用户不存在的情况下才能添加

扩展,接受一个参数,参数为add添加用户,当参数是del,删除用户,其他参数则退出

#!/bin/bash

if [ $1 == add ];then

for I in {1..10};do

! id user$I &&useradd user$I -p user$I

done

 

elif [ $1 == del ];then

for I in {1..10};do

id user$I >/dev/null && userdel user$I

done

else

echo "paramiter wrong"

fi

例:分别显示当前系统上所有默认shellbash的用户和默认shellnologin的用户,并统计各类shell的用户总数如:there have 3 usersthey name is ……

#!/bin/bash

for I in `grep 'bash' /etc/passwd|cut -d: -f1`;do

A="$A,$I"

done

 

echo "users`grep 'bash' /etc/passwd|wc -l`name is $A"


你可能感兴趣的:(编程,shell,条件判断)