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.