测试开发必备技能之shell脚本编程一【多测师】
一)Shell基本定义:
1,bash的基础特性
shell是一种命令行解释器,是为用户和操作系统之间的通信提供的一种接口
bash重要的特性之二:命令补全
根据内建命令或或外部命令各自查找方式查找以用户指定的字符开头的命令:
如果用户指定的开头的字符串能惟一标识某命令,则tab键可直接补全此命令;
否则,则两次tab键可显示所有以指定字符串开头的命令;
2,路径补全:
路径:/usr/share/doc
路径基名:doc
目录名:/usr/share
# basename NAME [SUFFIX]
# dirname NAME
bash的工作特性之三:命令执行状态返回值
命令执行成功与否的状态,由bash自己追踪;保存在特殊变量“$?”中;
0-255:
0:成功
1-255: 失败
3,程序的组成部分:二进制程序、库、配置文件、帮助文件
echo命令:
echo [OPTIONS] [STRING]...
-n: 关闭自动换行功能
-e: 启用转义符
\t: tab键
\n: new line
declare声明变量的类型
相当于global 声明一个变量为全局变量
export.UTF-8 export
Linux操作系统下终端乱码的终极解决方案
4,启动脚本:(1)#bash /PATH/TO/SCRIPT_FILE
(2)#需要执行权限, ./PATH/TO/SCRIPT_FILE
(3)shebang:#!/bin/bash
bash的常用选项:
-n:检查脚本中的语法
-x:调试执行脚本
5,测试表达式;
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
整数测试:隐含着做数值大小比较,所以不要给变量引用加引用
$A -gt $B:是否大于,是则为真,否则为假
$A -ge $B:是否大于等于
$A -lt $B:是否小于
$A -le $B:是否小于等于
$A -eq $B:是否等于
$A -ne $B:是否不等于
字符串测试:ASCII数值越大,字符比较时其值越大:
"$A" > "$B":是否大于
"$A" < "$B":是否小于
"$A" == "$B":是否等于
"$A" != "$B":是否不等于
-z "$A":是否为空,空则为"真",否则为"假"
-n "$A":是否不空,不空则为真,否则为假
注意:应用使用[[ EXPRESSION ]]
文件测试:测试文件存在及属性:
-e $file:是否存在:如果存在为真,否则为假
-a $file:同参数-e
-f $file:判断文件是否存在且为普通文件
-d $file:文件是否存在且目录
-h $file:是否存在且为符号链接文件
-L $file:同参数-h
-b $file:是否存在且为块设备文件
-c $file:是否存在且为字符设备文件
-S $file:是否存在且为套接字文件
-p $file:是否存在且为管道文件
-r $file:当前用户对文件是否拥有读权限
-w $file:当前用户对文件是否拥有写权限
-x $file:当前用户对文件是否拥有执行权限
-u $file:文件是否拥有SUID权限
-g $file:文件是否拥有SGID权限
-k $file:文件是否拥有sticky权限
-O $file:当前用户是否为指定文件的属主
-G $file:当前用户是否为指定文件的属组
二)Shell脚本练习一:
1,写一个程序,判断文件是否存在,没有则创建;
2,统计某一个文件的行数;
3,比较俩个数的大小;
4,统计文件的行数;
[root@localhost xiaoshu5]# cat xiaoshu3.sh
#!/bin/bash
#author by xiaowang
if [ $# -lt 1 ]; then
echo "at least one agument"
exit 1
fi
if [ -f $1 ]; then
lines=$(wc -l $1|cut -d' ' -f1)
echo "$1 has $lines lines"
else
echo "$1 not exists or not a file!"
fi
[root@localhost xiaoshu5]# sh xiaoshu3.sh
at least one agument
[root@localhost xiaoshu5]# sh xiaoshu3.sh xiaowang.py
xiaowang.py has 9 lines
[root@localhost xiaoshu5]# sh xiaoshu3.sh xiaoxiao
xiaoxiao not exists or not a file!
[root@localhost xiaoshu5]#
5,1-100之内奇数之和;
6,1-100之内偶是之和;
三)Shell脚本练习二:
1、如果目录不存在,则创建它,否则显示其存在,并显示内容类型
#!/bin/bash
#
filename="/home/duoceshi/shell"
if [ -e $filename ];then
echo "$filename exists"
file $filename
else
mkdir -p $filename
fi
2、判断脚本传入的第一个位置参数$1是否为文件,如果是文件则统计文件行数,否则显示文件不存在或不是一个文件
#!/bin/bash
#
if [ -f $1];then
wc -l $1
else
echo "$1 not exists or not a file"
fi
3、判断给定的两个数字大小
#!/bin/bash
#author:xiaoqian
read -p "Please enter two number:" -t 10 num1 num2基本篇.note
if [ -z $num1 ]; then
echo "at least two number!"
exit 1
fi
if [ $num1 -lt $num2 ]; then
echo "the max number is $num2,the min number is $num1"
else
echo "the max number is $num1,the min number is $num2!"
fi
4、输入一个用户,如果输入的用户存在则显示用户存在,否则创建用户,再如果输入为空,则提示用户不能为空后退出
#!/bin/bash
#
read -p "Please enter a username:" -t 10 username
if [ -z "$username" ]; then
username="test"
fi
echo $username
if id $username &> /dev/null; then
echo "$username exists"
else
useradd $username
fi
5、如果输入的位置参数$1为空,程序则退出,再如果输入的位置参数为文件,则统计文件行数,并取出行数
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "at least one argument"
exit 1
fi
if [ -f $1 ]; then
lines=$(wc -l $1|cut -d' ' -f1)
echo "$1 has $lines lines"
else
echo "$1 not exists or not a file!"
fi
6、给系统添加10个用户,如果存在则提示用户存在,否则创建10个用户
#!/bin/bash
#create by xiaoqian
for i in {1..10};do #等价于:for i in $(seq 1 10);do
if id user$i &> /dev/null; then
echo "user$i exists!"
else
useradd user$i
echo "add user user$i finished"
fi
done
7、显示/var/log目录下所有文件的类型
#!/bin/bash
#
for filename in /var/log/*;do
file $filename
done
8、取出系统所有用户的主组
#!/bin/bash
#
for username in $(cut -d: -f1 /etc/passwd);do
echo "$username primary group:$(id -n -g $username)" #id -n -g username也可以写成id -ng username
done
9、求1到100之间的和
#!/bin/bash
#
declare -i sum=0
for i in $(seq 1 100);do
let sum+=$i #也可以写成sum=$[$sum+$i]
done
echo $sum
10、求1到100内之间偶数之和
第一种方法:
#!/bin/bash
#
declare -i sum=0
for i in $(seq 1 2 100);do
sum=$[$sum+$i] #相当于let sum+=$i
done
echo $sum
第二种方法:
#!/bin/bash
#
declare -i sum=0
for i in $(seq 1 100);do
if [ $(($i %2 )) -eq 0 ]; then #$(($i % 2))可以写成$[$i%2]
sum=$[$sum+$i] #相当于let sum+=$i
fi
done
echo $sum
11、显示当前系统用户ID号为偶数的用户名和用户ID
12、显示/var/log目录下所有的普通文件,然后统计一共有多少个这样的文件
#!/bin/bash
#
declare -i counter=0
for filename in /var/log/*;do
if [ -f $filename ]; then
let counter++
echo "Total:$counter files,$filename"
fi
done
13、获取当前主机名称,如果当前主机名为空或为localhost时,则将它修改为www.duoceshi.com
#!/bin/bash
#create by icestic chien
hostname=`hostname`
if [ -z $hostname -o $hostname == 'localhost' ]; then
hostname www.duoceshi.com
fi
14、写一个脚本,传入一个文件参数判断,传入的文件是什么类型文件?
if [ $# -lt 1 ]; then
echo "at least 1 agrs."
exit 1
fi
if [ -f $1 ]; then
echo "Regular file."
elif [ -d $1 ]; then
echo "Directory!"
elif [ -h $1 ]; then
echo "Symbolic link."
elif [ -b $1 ]; then
echo "Block special."
elif [ -c $1 ]; then
echo "Character special."
elif [ -S $1 ]; then
echo "Socket file."
else
echo "file type is not exists!"
fi
15、打印九九乘法表
#!/bin/bash
#
for i in {1..9}; do
for j in $(seq 1 $i); do
echo -n -e "${j}X${i}=$[${i}*${j}]\t"
done
echo
done
16、写一个脚本,分别可以传4个参数为:start、stop、restart、status,如果是start参数创建一个文件,如果是stop删除一个文件,如果是restart先删除再创建,如果是status显示文件状态,如果存在则显示running,否则显示not running...
#!/bin/bash
#
prog=$(basename $0)
lockfile="/var/lock/subsys/$prog"
#echo $lockfile
if [ $# -lt 1 ]; then
echo "Usage:$prog start|stop|restart|status"
exit 1
fi
if [ "$1" == "start" ]; then
if [ -f $lockfile ]; then
echo "$prog is started yet."
else
touch $lockfile && echo "Starting $prog ok.." ||echo "Starting $prog failed..."
fi
elif [ "$1" == "stop" ]; then
if [ -f $lockfile ]; then
rm -rf $lockfile && echo "Stop $prog ok.." || echo "Stop $prog failed..."
else
echo "$prog is stopped yet."
fi
elif [ "$1" == "restart" ]; then
if [ -f $lockfile ]; then
rm -f $lockfile && touch $lockfile && echo "Restarting $prog ok.."
else
touch $lockfile && echo "$prog is stopped,Starting $prog ok.."
fi
elif [ "$1" == "status" ]; then
if [ -f $lockfile ]; then
echo "Running..."
else
echo "Stopped.."
fi
else
echo "Usage:$prog start|stop|restart|status"
exit 1
fi
#!/bin/bash
#
prog=$(basename $0)
lockfile="/var/lock/subsys/$prog"
#echo $lockfile
if [ $# -lt 1 ]; then
echo "Usage:$prog start|stop|restart|status"
exit 1
fi
case $1 in
start)
if [ -f $lockfile ]; then
echo "$prog is started yet."
else
touch $lockfile && echo "Starting $prog ok.." ||echo "Starting $prog failed..."
fi
;;
stop)
if [ -f $lockfile ]; then
rm -rf $lockfile && echo "Stop $prog ok.." || echo "Stop $prog failed..."
else
echo "$prog is stopped yet."
fi
;;
restart)
if [ -f $lockfile ]; then
rm -f $lockfile && touch $lockfile && echo "Restarting $prog ok.."
else
touch $lockfile && echo "$prog is stopped,Starting $prog ok.."
fi
;;
status)
if [ -f $lockfile ]; then
echo "Running..."
else
echo "Stopped.."
fi
;;
*)
echo "Usage:$prog start|stop|restart|status"
exit 1
esac
循环相关
1、求100以内正整数之和
#!/bin/bash
#
declare -i sum=0
for i in $(seq 1 100);do
let sum+=$i #也可以写成sum=$[$sum+$i]
done
echo $sum
#!/bin/bash
#
declare -i i=1
declare -i sum=0
while [ $i -le 100 ]; do
let sum+=$i
let i++
done
echo "The sum is:$sum"
2、打印九九乘法表
#!/bin/bash
#
for i in {1..9}; do
for j in $(seq 1 $i); do
echo -n -e "${j}X${i}=$[${i}*${j}]\t"
done
echo
done
#!/bin/bash
declare -i i=1
declare -i j=1
while [ $j -le 9 ]; do
while [ $i -le $j ]; do
echo -e -n "${i}X${j}=$[$i*$j]\t"
let i++
done
echo
let i=1
let j++
done
3,startup脚本:
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/lastest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
case $1 in
start)
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec $CATALINA_HOME/bin/catalina.sh start ;;
*)
echo "Usage: `basename $0` {start|stop|restart}"
exit 1
;;
esac