16、bash脚本编程之三 整数测试及特殊变量

16.1 算术运算方法

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`

16.2 测试方法:

[ expression ]

[[ expression ]]

test expression

bash中常用的条件测试有三种:

16.2.1 整数测试:

        -gt:大于

        -le:小于等于

        -ne:不等于

        -eq:等于

        -ge

        -lt

测试两个整数(只有进行整数测试时才能用[],其他情况一定不能加)

INT1=63

INT2=77

[ $INT1 -eq $INI2 ]

[[ $INT1 -eq $INT2 ]]

test $INT1 -eq $INT2  

16.2.2 文件测试: 

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

-f FILE: 测试文件是否为普通文件

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

-r FILE: 测试当前用户对指定文件是否有读取权限;

-w FILE: 测试当前用户对指定文件是否有写权限;

-x FILE: 测试当前用户对指定文件是否有执行权限;

例:

[ -e /etc/inittab ]

[ -x /etc/rc.d/rc.sysinit ]     

练习:写一个脚本

给定一个文件:

如果是一个普通文件,就显示之;

如果是一个目录,亦显示之;

否则,此为无法识别之文件;

16.3 定义脚本退出状态码

exit: 退出脚本

exit #

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;

测试脚本是否有语法错误:

bash -n 脚本(不能作为判断依据,只能用来参考)

bash -x 脚本:单步执行

16.4 bash变量的类型:

        (1)本地变量(局部变量)

        (2)环境变量

        (3)位置变量: 

                $1, $2, ...(表示脚本的第n个参数)

                ./filetest.sh /etc/fstab /etc/inittab

                $1: /etc/fstab

                $2: /etc/inittab

                shift:轮换轮替

                [daniel@localhost tmp]$ vim shift.sh

                [daniel@localhost tmp]$ chmod +x shift.sh 

                [daniel@localhost tmp]$ ./shift.sh 

                [daniel@localhost tmp]$ ./shift.sh 1 2 3

                1

                2

                3

                [daniel@localhost tmp]$ help shift

                shift: shift [n]

                    Shift positional parameters.

                    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is

                    not given, it is assumed to be 1.

                    Exit Status:

                    Returns success unless N is negative or greater than $#.

                #!/bin/bash

                #

                echo $1

                shift

                echo $1

                shift

                echo $1

       (4)特殊变量:

                $?:上一条命令的退出状态码

                $#:参数的个数

                $*: 参数列表

                $@:参数列表

练习1:写一脚本

能接受一个参数(文件路径)

判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示"No such file."

练习:写一个脚本

给脚本传递两个参数(整数);

显示此两者之和,之乘积;

#!/bin/bash

#

if [ $# -lt 2 ]; then

  echo "Usage: cacl.sh ARG1 ARG2"

  exit 8

fi

echo "The sum is: $[$1+$2]."

echo "The prod is: $[$1*$2]."

练习2:写一个脚本,完成以下任务

1、使用一个变量保存一个用户名;

2、删除此变量中的用户,且一并删除其家目录;

3、显示“用户删除完成”类的信息;

练习3:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行;

如果有,则显示其空白行数;否则,显示没有空白行。

#!/bin/bash

#grep "^$" /etc/inittab &> /dev/null

#TEST=$?

#if [ $TEST -eq 0 ];then

#    echo `grep "^$" /etc/inittab | wc -l`

#else

#    echo " no blank lines"

#fi

###张帅

#!/bin/bash

#A=`grep '^$' /etc/inittab | wc -l`

#if [ $A -gt 0 ]; then

# echo "$A"

#else

# echo "meiyoukongbaihang"

#fi

#脚本执行过程比较浪费,效率比较低,所以使用exit直接退出脚本

#!/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."

练习4:写一个脚本

给定一个用户,判断其UID与GID是否一样

如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。

#!/bin/bash

USERNAME=user1

USERID=`id -u $USERNAME`

GROUPID=`id -g $USERNAME`

if [ $USERID -eq $GROUPID ]; then

  echo "Good guy."

else

  echo "Bad guy."

fi

进一步要求:不使用id命令获得其id号;

#!/bin/bash

#

USERNAME=user1

if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then

  echo "No such user: $USERNAME."

  exit 1

fi

USERID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`

GROUPID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f4`

if [ $USERID -eq $GROUPID ]; then

  echo "Good guy."

else

  echo "Bad guy."

fi

exit:退出脚本(用于定义执行状态及其结果)

exit +数值(0-255)0为正确,其他为错误

练习5:写一个脚本

给定一个用户,获取其密码警告期限;

而后判断用户密码使用期限是否已经小于警告期限;

提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

如果小于,则显示“Warning”;否则,就显示“OK”。

圆整:丢弃小数点后的所有内容(bash默认使用此种方式进行计算)

#!/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

练习6:写一个脚本

判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”;否则显示“OK”。

Comments Closed.