6.1
给定一个用户,判断其UID和GID是否一样 "^$USERNAME\>"(行首第一个单词)
如果一样,就显示此用户为"good guy";否则,就显示此用户为"bad guy"
#!/bin/bash
#
USERNAME =user1
if !grep "^$USERNAME\>" /etc/passwd &> /dev/null;then 用户不存在
echo "No such user: $USERNAME."
exit 1
fi
USERID = `id -u $USERNAME`
GROUPID =`id -g $USERNAME`
if[ $USERID -eq $GROUPID ];then
echo "good guy"
else
echo "bad guy"
fi
exit: 退出脚本
exit #(#代表数字)
bash中常用的条件测试三种
-gt
-le
-ne
-ge
-lt
-eq 非0值都是假
--------------------只有上面才能用[],其他表达式中不能出现[]
INT1 = 63
INT2 = 77
[ $INT1 -eq $INT2 ]
[[ $INT1 -eq $INT2 ]]
TEST $INT1 -eq $INT2
if [ `grep "^$USENAME\>" /etc/passwd | cut -d: -f3` -eq 0 ];then 对
if [ `grep "^$USENAME\>" /etc/passwd ` -eq 0 ];then 错(前面是一行)
测试方法
[ expression ] bash的命令
` expression ` bash关键字
test expression
文件测试:
-e FILE:测试一个文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录的
-r FILE: 测试当前用户对指定文件是否有读取权限
-w
-x FILE
[ -e /etc/initttab ]
[ -x /etc/rc.d/rc.sysinit ]
练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行
如果有,则显示其空白行数,否则,显示没有空白行
#!/bin/bash
FILE = /etc/inittab
if [! -e $FILE ];then
echo "No $FILE."
exit 8
fi
if grep "^$" $FILE &> /dev/null;then
echo "Total blank lines: `grep "^$" $FILE | wc -l`."
else
echo "No blank line."
fi
圆整,丢弃小数点后的内容
expr命令一般用于整数值
#expr argument operator argument
练习:编写一个脚本
给定一个用户,获取其密码警告期限:
而后判断用户最近一次修改密码时间距今天是否已经小于警告期限
提示:算术运算的方法$[$A-$B]:表示变量A的值减去变量B的值的结果
如果小于,则显示"Warning":否则,就显示"OK"
#!/bin/bash
#
W=`grep "student" /etc/shadow | cut -d: -f6`
S=`date +%s`
T=`expr $S/86400`
L=`grep "^student" /etc/shadow | cut -d: -f5`
N=`grep "^student" /etc/shadow | cut -d: -f3`
SY=$[$L-$[$T-$N]]
if [ $SY -lt $W ];then
echo 'Worning'
else
echo 'OK'
fi
练习:写一个脚本
判读命令历史中历史命令的总条目是否大于1000;如果大于,则显示
"Some command will gone.";否则显示"ok"
history 当前显示缓冲区中的条数(会大于1000)
$HISTSIZE 都只显示1000
$HISTFILESIZE 都只显示1000
history | tail -l | cut -d' ' -f1 由于前面有一个空格,取不出条数,当取第二个字段
history | tail -l | cut -d' ' -f2
#!/bin/bash
#
COUNT = history | tail -l | cut -d' ' -f2
if $COUNT -gt 1000 ;then
echo "Some command will gone."
else
echo "ok"
fi
多分支的if语句
if 判断条件1;then
statement1
...
elif 判断条件2;then
statement2
...
elif 判断条件3;then
statement3
...
else 判断条件4;then
statement4
...
fi
#!/bin/bash
#
FILE =/etc/inittab
if [ -e $FILE ];then
echo "OK"
else
echo "No such file"
fi
测试脚本是否有语法错误
bash -n filetest.sh
bash -x 脚本:单步执行
给定一个文件,如果是一个普通文件,就显示之
如果是一个目录,亦显示之
否则,此为无法识别之文件
filetest2.sh
#!/bin/bash
#
FILE = /etc/rc.d/rc.sysinit
if [ ! -e $FILE ];then
echo "NO such file"
exit 6
fi
if [ -f $FILE ];then
echo "Common file"
elif [ -d $FILE ];then
echo "Directory"
else
echo "Unkown."
fi
定义脚本退出状态码
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令
的退出码即为脚本的退出状态码
bash变量的类型:
本地变量(局部变量) 当前shell进程
环境变量 当前shell进程及其子进程
位置变量:$1 $2 ...
shift(踢掉一个位置值)默认踢1个
shift [n]踢掉n个
特殊变量 $?
$#:参数的个数
$*:参数列表
$@:参数列表
./filetest.sh /etc/fstab /etc/inittab
$1:/etc/fstab
$2:/etc/inittab
练习:写一个脚本
能接受一个参数(文件路径)
判定:此参数如果是一个存在的文件,就显示OK ,否则显示No such file
#!/bin/bash
#
echo $#
echo $*
echo $@
if[ $# -lt 1 ];then
echo "Usage: ./filetest3.sh ARG1 [ARG2 ...]"
if [ -e $1 ];then
echo "ok"
else
echo "No such file"
fi
练习:写一个脚本
给脚本传递两个参数(整数)
显示此两个参数之和,之乘积
#!/bin/bash
#
if [ $# -lt 2 ];then
echo "Usage: cac1.sh ARG1 ARG2"
exit
fi
echo "The sum is : $[$1 + $2]."
echo "The prod is : $[$1 * $2]."