如果用户不存在
添加用户,给密码并显示添加成功
否则
显示已经存在,没有添加
bash中如何实现条件判断
条件判断类型
整数测试
-eq:两个整数是否相等
-ne:测试俩个整数是否不等
-gt:一个数是否大于另一个数
-lt:一个数是否小于另一个数
-ge:大于等于
-le:小于等于
字符串测试
文件测试
条件测试的表达式test或是 [ ]
通过id+username来判断用户是否存在
命令间的逻辑关系
逻辑与&&:第一个条件为假,后边的不用判断
逻辑或||:第一个条件为真,后面的不用判断
例如如果/etc/inittab文件的行数大于100,就显示大文件
[ ‘wc –l /etc/inittab | cut –d ‘ ‘ –f1 ’ –gt 100 ] &&echo “big file”
变量名称只能包含字母数字下划线,数字不能开头,不应该重名,最好见名知义
如果用户存在就显示用户,否则就添加用户
id user1 && echo “user1 exit” || useradd user1
如果用户不存在就添加,否则就显示用户
! id user1 && useradd user1 || echo “user1 exit”
如果用户不存在添加用户并给密码,否则显示已经存在
! id user1 && useradd user1 && echo “user1”| passwd –stdin user1 || echo “user1 exit”
题
用脚本完成
添加3个用户user1,user2,user3先判断用户是否存在,不存在之后在添加
添加完成后显示一共添加了几个用户,不能包括事先存在而没有添加的
最后显示当前系统上一个有多少个用户
#!/bin/bash
! iduser1 &> /dev/null && useradd user1 && echo “user1” |passwd –stdin user1 &>/dev/null || echo “user1 exit”
! iduser2 &> /dev/null && useradd user2 && echo “user2” |passwd –stdin user2 &>/dev/null || echo “user2 exit”
! iduser3 &> /dev/null && useradd user3 && echo “user3” |passwd –stdin user3 &>/dev/null || echo “user3 exit”
USERS=`wc–l /etc/passwd | cut –d: -f1`(反引号是能引用命令的执行结果)
echo“$USERS users”
写一个脚本
如果UID为0,就显示此为管理员
否则显示为普通用户
#!/bin/bash
NAME=user1
USERID=`id–u $NAME `
[$USERID –eq 0 ] && echo “admin” || echo “common user”
条件判断,控制结构
单分支if语句
if判断条件;then
command
fi
例如
#! /bin/bash
NAME=user1
If id $NAME &> /dev/null ; then
echo “$NAME exit”
fi
双分支if语句
If 判断条件;then
command
else
command
fi
例如
#! /bin/bash
NAME=user17
If id $NAME &> /dev/null ; then
echo “$NAME exit”
else
echo “$NAMEnot exit”
fi
例如
#! /bin/bash
NAME=user17
If id $NAME &> /dev/null ; then
echo “$NAME exit”
else
useradd$NAME
echo$NAME | passwd –stdin $NAME &> /dev/null
echo “add$NAME finished”
fi
写一个脚本判断当前系统上是否有用户的默认shell是bash,如果有就显示有多少个这类用户,否则就显示没有这类用户
#!/bin/bash
grep “\
RETVAL=$?
if [ $RETVAL –eq 0 ]; then
USERS=`grep “\
echo “theshells of $USERS users is bahs”
else
echo “no suchuser”
fi
写一个脚本判断系统上是否有用户的默认shell是bash,如果有就显示其中的一个用户名,否则就显示没有这类用户
#!/bin/bash
grep “\
RETVAL=$?
if [ $RETVAL –eq 0 ]; then
AUSER=`grep“\
echo “$AUSERis one of such users”
else
echo “nosuch user”
fi
写一个脚本给定一个文件比如/etc/inittab,判断这个文件中是否有空白行,如果有则显示空白行数,否则显示没有空白行
#!/bin/bash
FILE=/etc/inittab
if grep “^$” $FILE &> /dev/null; then
echo “totalblank lines:`grep “^$” $FILE| wc –l ` ”
else
echl “noblank lines”
fi
写一个脚本给定一个用户判断其UID与GID是否一样,如果一样就显示此用户为goodguy否则就显示为badguy
#!/bin/bash
USERNAME=user1
USERID=`id –u $USERNAME`
GROUPID=`id –g $USERNAME`
if [ $USERID –eq $ FROUPID ]; then
echo “goodguy”
else
echo “badguy”
fi
进一步要求,不使用id命令获得其id号
#!/bin/bash
USERNAME=user1
if ! grep “^$USERNAME\>” /etc/passwd &> /dev/null;then
echo “nosuch user: $USERNAME”
exit(退出脚本使用的,一旦发现这个命令后面的就不再执行,直接退出脚本)
fi
USERID=`grep “^$USERNAME\>” /etc/passwd | cut –d: -f3`
GROUPID=`grep “^$USERNAME\>” /etc/passwd | cut –d: -f4`
if [ $USERID –eq $ FROUPID ]; then
echo “goodguy”
else
echo “badguy”
fi
Shell中如何进行算术运算
A=3
B=6
1·let算术运算表达式
let C=$A+$B
2·$[算术运算表达式]
C=$[$A+$B]
3`$((算术运算表达式))
C=$(($A+$B))
4·expr算术运算表达式,表达式中个操作数及运算符之间要有空格而且要使用命令引用
C=`expr$A + $B`s
整数测试及特殊变量
bash总中常用的条件测试:
整数测试:-gt,-le,-ne,-eq,-ge,-lt
exit:退出脚本,定义执行状态结果的;0是正确执行,其余的是错误输出
文件测试:
-e:测试文件是否存在
-f:测试文件是否问普通文件
-d:测试指定路径是否为目录
-r:当前用户对文件是否有读权限
-w:是否有修改权限
-x:是否有执行权限
举例
#!/bin/bash
FILE=/etc/inittab
if [ ! –e $FILE ]; then
echo “nosuch $FILE”
exit
fi
if grep “^$” $FILE &> /dev/null; then
echo “totalblank lines `grep “^$” $FILE | wc –l ` ”
else
echo “nosuch blank line”
fi
写一个脚本给定一个用户获取其密码警告期限而后判断用户最近一次修改密码时间距今天是否已经小于警告期限
提示:算术运算的方法$[$A-$B]:表示变量A的值减去变量B的值的结果,如果小于则显示warning否则就显示ok,提示用date获取现在距离1970年1月1日的时间,减去最近一次修改密码的时间,得出的结果与警告时间做对比
#!/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 “warning”
else
echo “ok”
fi
写一个脚本判定命令历史的总条目是否大于1000,如果大于就显示somecommand will gone,否则显示ok
#!/bin/bash
HISTORY=`cat /root/.bash_history | wc -l`
if [ $HISTORY –gt 1000 ]; then
echo”somecommand will gone”
else
echo “ok”
fi
多分支if语句
if 判断条件;then
command
elif
command
else
command
fi
判断文件是否存在
#!/bin/bash
FILE=/etc/inittab
if [ -e $FILE ]; then
echo “ok”
else
echo “nosuch file”
fi
测试脚本是否有语法错误:bash–n +脚本名
写一个脚本
给定一个文件,如果是普通文件就显示,如果是一个目录亦显示之,否则此为无法识别之文件
#!/bin/bash
FILE=/etc/rc.d/rc.sysinit
if [ ! –e $FILE ]; then
echo “nosuch file”
fi
if [ -f $FILE ]; then
echo “commonfile”
elif [-d $FILE ]; then
echo “directory”
else
echo”unknow”
fi
写一个脚本,能接受一个参数(文件路径),判定此参数如果是一个存在的文件,就显示ok,否则显示nosuch file
位置变量和特殊变量
位置变量:shift(命令)——将原来的参数用完之后踢除,原来的第二个变成了第一个
特殊变量
$#:参数个数
$*:参数列表
$@:参数列表
#!/bin/bash
echo $#(特殊变量,参数的个数)
if [ -e $1 ]; then(位置变量)
echo“ok”
else
echo”nosuch file”
fi
写一个脚本,给脚本传递2个参数(整数),显示2个数的和与积
#!/bin/bash
If [ $# -lt 2 ]; then
Echo”usage:cacl.sh ARG1 ARG2”
Exit
Fi
Echo “the sum is : $[ $1 + $2]”
Echo “the prod is: $[ $1 * $2 ]”