条件测试类型:
① 整数测试
② 字符测试
③ 文件测试
表达式:[ 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 �d ‘ ’ �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
例:如果用户UID为0,那么现实为管理员,否则,现实为普通用户。
#!/bin/bash
NAME=users#改为read �p “ID:” NAME 实现交互
If
[ `id �u $NMAE` -eq 0 ]
then
echo “Adminitrator!”
else
echo“Common 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 判断1;then
statement1
……
elif 判断2;then
statement2
……
elif ……
else
statement N
fi
例:输入一个文件路径,测试文件是否存在。
#!/bin/bash
if [ $# -lt 1 ] || [ $# -gt 1 ];then
echo “NO Parameters !”
exit 7
fi
if[-e $1];then
echo“OK!”
else
echo“NO 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 �n �u $1` == `id �n �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循环:要有进入条件,退出条件:for、while、until
1 for 变量 in 列表 ;do
循环体
done
生成列表:{ 1..N}、`seq 起始数 步进数 结束数`
declare :声明变量类型
-i :整型
-x:声明为环境变量
例:求1到100的和
#!/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,只想默认shell为bash的用户问好。
#!/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
例:分别显示当前系统上所有默认shell为bash的用户和默认shell为nologin的用户,并统计各类shell的用户总数如:there have 3 users,they 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"