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]."