|
16、bash脚本编程之三 整数测试及特殊变量
2021年07月13日 |
|
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”。 |