写一个脚本:
计算100以内所有能被3整除的正整数的和;
取模,取余:%
3%2=1
100%55=45
#!/bin/bash
let SUM=0
for I in {1..100};do
TMP=$[$I%3]
if [ $TMP -eq 0 ];then
SUM=$[$SUM+$I]
fi
done
echo "SUM is $SUM"
写一个脚本:
计算100以内所有奇数的和以及所有偶数的和;分别显示之;
写一个脚本:
每5秒钟进行判断某用户是否登录。
#!/bin/bash
for I in `seq 100`;do
w|grep "wuxiangd" &>/dev/null && echo "wuxiangdong is loggin in" || echo "wuxiangdong is not loggin in"
sleep 5
done
写一个脚本:
启动服务的选项:只接受参数start,stop,restart,status其中之一
#!/bin/bash
if [ $# -lt 1 ];then
echo "Usage: `basename $0` {start|stop|restart|status}"
fi
case $1 in
-sta*)
echo "service start"
;;
-stop)
echo "service stop"
;;
-restart)
echo "service restart"
;;
-status)
echo "service running"
;;
*)
echo "Unknow"
exit 2
;;
esac
写一个脚本:
判断10个随机数中,最大和最小的随机数,并且输出
#!/bin/bash
declare -i MIN=0
declare -i MAX=0
for I in {1..10};do
MYRANDOM=$RANDOM
[ $I -eq 1 ] && MIN=$MYRANDOM
if [ $I -lt 10 ];then
echo -n "$MYRANDOM ,"
else
echo "$MYRANDOM"
fi
if [ $MYRANDOM -gt $MAX ];then
MAX=$MYRANDOM
fi
if [ $MYRANDOM -lt $MIN ] ;then
MIN=$MYRANDOM
fi
done
echo "The Max is $MAX"
echo "The Min is $MIN"
写一个脚本:
通过选项-del -add -v等参数进行删除和增加用户。
#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0
for I in `seq 0 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-v|--verbose)
DEBUG=1
shift ;;
-h|--help)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 0
;;
--add)
ADD=1
ADDUSERS=$2
shift 2
;;
--del)
DEL=1
DELUSERS=$2
shift 2
;;
*)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 7
;;
esac
fi
done
if [ $ADD -eq 1 ]; then
for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do
if id $USER &> /dev/null; then
[ $DEBUG -eq 1 ] && echo "$USER exists."
else
useradd $USER
[ $DEBUG -eq 1 ] && echo "Add user $USER finished."
fi
done
fi
if [ $DEL -eq 1 ]; then
for USER in `echo $DELUSERS | sed 's@,@ @g'`; do
if id $USER &> /dev/null; then
userdel -r $USER
[ $DEBUG -eq 1 ] && echo "Delete $USER finished."
else
[ $DEBUG -eq 1 ] && echo "$USER not exist."
fi
done
fi
练习:写一个脚本showlogged.sh,其用法格式为:
showlogged.sh -v -c -h|--help
其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;
如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息;如
Logged users: 4.
They are:
root tty2 Feb 18 02:41
root pts/1 Mar 8 08:36 (172.16.100.177)
root pts/5 Mar 8 07:56 (172.16.100.177)
hadoop pts/6 Mar 8 09:16 (172.16.100.177)
#!/bin/bash
#
declare -i SHOWNUM=0
declare -i SHOWUSERS=0
for I in `seq 1 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-h|--help)
echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
exit 0 ;;
-v|--verbose)
let SHOWUSERS=1
shift ;;
-c|--count)
let SHOWNUM=1
shift ;;
*)
echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
exit 8 ;;
esac
fi
done
if [ $SHOWNUM -eq 1 ]; then
echo "Logged users: `who | wc -l`."
if [ $SHOWUSERS -eq 1 ]; then
echo "They are:"
who
fi
fi
写个脚本,按如下方式执行:
mkscript.sh -v|--version VERSION -a|--author AUTHOR -t|--time DATETIME -d|--description DESCRIPTION -f|--file /PATH/TO/FILE -h|--help
1、此脚本能创建或打开-f选项指向的文件/PATH/TO/FILE;
如果其为空文件,能自动为其生成第一行;
如果文件不空,且第一行不是#!/bin/bash,则中止此脚本,并报错“The file is not a bash script.";
否则,则直接使用vim 打开此文件;
提示:/PATH/TO/FILE,要判断其目录是否存在;如果不存在,则报错;
2、如果为空文件,自动生成的第一行内容为:
#!/bin/bash
3、如果为空文件,且使用了-a选项,则在文件中添加“# Author: -a选项的参数”,比如:
# Author: Jerry
4、如果为空文件,且使用了-t选项,则在文件中添加“# Date: 脚本执行-t选项后指定的时间”,比如:
# Date: 2013-03-08 18:05
5、如果为空文件,且使用了-d选项,则在文件中添加“# Description: -d选项的内容”,比如:
# Description: Create a bash script file head.
6、如果为空文件,且使用了-v选项,则在文件添加“# Version: -v后跟的参数”,比如:
# Version: 0.1
6、-h选项只能单独使用,用于显示使用帮助;
7、其它选项,显示帮助信息;
说明:
这是一个用于创建脚本的脚本,它可以自动帮助创建一个bash脚本的文件头,这样,以后使用此脚本来创建其它脚本将变得比较高效。比如:
#!/bin/bash
# Author: Jerry(jerry@magedu.com)
# Date: 2013-03-08 18:05
# Description: Create a bash script file head.
# Version: 0.1
#
实现:
#!/bin/bash
declare -i VERSION=0
declare -i AUTHOR=0
declare -i TIME=0
declare -i DESCRIPTION=0
declare -i FILE=0
for I in `seq $#`;do
-v|-version)
VERSION=1
MYVERSION=$2
-a|--author)
AUTHOR=1
MYAUTHOR=$2
shift 2
;;
-t|-time)
TIME=1
MYTIME=$2
shift 2
;;
-d|--description)
DESCRIPTION=1
MYDESCRIPTION=$2
shift 2
;;
-f|--file)
FILE=1
MYFILE=$2
shift 2
;;
-h|-help)
exit 0
;;
*)
esac
fi
done
#######################################################################################
if [ $FILE -eq 1 ];then
if [ -e $MYFILE ];then
MYHEAD=`head -1 $MYFILE`
if [ "$MYHEAD" == "#!/bin/bash" ];then
if [ $AUTHOR -eq 1 ];then
echo "#Author:$MYAUTHOR">>$MYFILE
fi
if [ $TIME -eq 1 ];then
echo "#Date:$MYTIME">>$MYFILE
fi
if [ $DESCRIPTION -eq 1 ];then
echo "#Description:$MYDESCRIPTION">>$MYFILE
fi
if [ $VERSION -eq 1 ];then
echo "#Version:$MYVERSION">>$MYFILE
fi
vim + $MYFILE
exit 0
else
echo "The file $MYFILE is not a bash Script!"
fi
else
touch $MYFILE
echo "#!/bin/bash">>$MYFILE
if [ $AUTHOR -eq 1 ];then
echo "#Author:$MYAUTHOR">>$MYFILE
fi
if [ $TIME -eq 1 ];then
echo "#Date:$MYTIME">>$MYFILE
fi
if [ $DESCRIPTION -eq 1 ];then
echo "#Description:$MYDESCRIPTION">>$MYFILE
fi
if [ $VERSION -eq 1 ];then
echo "#Version:$MYVERSION">>$MYFILE
fi
vim + $MYFILE
exit 0
fi
fi
写一个脚本:
1、通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线,
如果在线,就显示"ip is up.",其中的IP要换为真正的IP地址,且以绿色显示;
如果不在线,就显示"ip is down.",其中的IP要换为真正的IP地址,且以红色显示;
要求:分别使用while,until和for(两种形式)循环实现。
ping
-c(ping d的次数)
-W (多长时间内有效)
方法一:
#!/bin/bash
declare -i I=1
while [ $I -le 100 ];do
if ping -c 1 -W 2 10.25.84.$I &>/dev/null;then
echo "10.25.84.$I is up"
sleep 2
else
echo "10.25.84.$I is down"
sleep 2
fi
let I+=1
done
方法二:
#!/bin/bash
declare -i I=1
until [ $I -eq 100 ];do
if ping -c 1 -w 1 10.25.84.$I &>/dev/null;then
echo "10.25.84.$I is up"
sleep 1
else
echo "10.25.84.$I is down"
sleep 1
fi
let I+=1
done
方法三:
#!/bin/bash
for I in `seq 100`;do
if ping -c 1 -W 1 10.25.84.$I &>/dev/null;then
echo "10.25.84.$I is up"
sleep 1
else
echo "10.25.84.$I is down"
fi
done
方法四:
#!/bin/bash
for ((I=0;I<=100;I++));do
if ping -c 1 -W 1 10.25.84.$I &>/dev/null;then
echo "10.25.84.$I is up"
sleep 1
else
echo "10.25.84.$I is down"
sleep 1
fi
done
写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:
1、列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本;如果用户选择错误,就让用户重新选择;
2、当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,n就退出;否则,让用户重新选择;
3、抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区);
并为其创建三个主分区,第一个为20M,第二个为512M, 第三个为128M,且第三个为swap分区类型;
(提示:将分区命令通过echo传送给fdisk即可实现)
fdisk -l |grep "
dd if=/dev/zero of=/dev/sdb bs=512 count=1
sync
sleep 3
###########################################################################################
#!/bin/bash
echo "This is all partion:"
PARTITIONS=`fdisk -l 2>/dev/null |grep "^Disk /dev/[sh]d[a-z]"|awk '{print $2}'|cut -d: -f1`
echo "$PARTITIONS"
echo -e "Plerse Input partion:\033[31m(quit)\033[0m"
read PART
if [ $PART == 'quit' ];then
exit 0
fi
until echo "$PARTITIONS" | grep "$PART" ;do
read PART
done
echo -e "The partition will be formate:\033[31m[y|n]\033[0m"
read SELECT
if [ $SELECT == 'y' ];then
dd if=/dev/zero of=$PART bs=512 count=1 &>/dev/null
sync
sleep 3
echo "Format complete!"
else
exit 0
fi
echo -e "Do you want to make a partion?\033[31m[y|n]\033[0m"
read SELECT1
if [ $SELECT1 == 'y' ];then
echo 'n
p
1
+40M
n
p
2
+512M
n
p
3
+128M
t
3
82
w'|fdisk $PART &>/dev/null
if [ $? -eq 0 ];then
echo "Build successful!"
fi
else
exit 0
fi
echo -e "Do you want to build file system?\033[31m[y|n]\033[0m"
read SELECT2
if [ $SELECT2 == 'y' ];then
for I in `echo "$PARTITIONS"`;do
mke2fs -j $I &>/dev/null
done
echo "build complete!"
else
exit 0
fi
fdisk -l
写一个脚本,完成以下功能:
说明:此脚本能于同一个repo文件中创建多个Yum源的指向;
1、接受一个文件名做为参数,此文件存放至/etc/yum.repos.d目录中,且文件名以.repo为后缀;要求,此文件不能事先存,否则,报错;
2、在脚本中,提醒用户输入repo id;如果为quit,则退出脚本;否则,继续完成下面的步骤;
3、repo name以及baseurl的路径,而后以repo文件的格式将其保存至指定的文件中;
4、enabled默认为1,而gpgcheck默认设定为0;
5、此脚本会循环执行多次,除非用户为repo id指定为quit;
###########################################################################################
#!/bin/bash
CREATE=0
if [ $# -gt 0 ];then
case $1 in
--help|-h)
echo "Usage:`basename $0` {--help|-h }"
exit 0;
;;
-c|--create)
CREATE=1;
FILENAME=$2;
;;
*)
echo "Usage:`basename $0` {--help|-h }"
exit 1;
;;
esac
fi
if [ $CREATE -eq 1 ];then
if [ -e /etc/yum.repos.d/${FILENAME}.repo ];then
echo "$FILENAME exis!"
exit 1;
else
ID=yes
declare -i I=1
while [ $ID != 'quit' ] && [ $ID != 'q' ] ;do
touch /etc/yum.repos.d/${FILENAME}.repo
echo "Create ${I}th"
read -p "Please input ID OR {quit|q}" ID
if [ $ID == 'quit' ] || [ $ID == 'q' ];then
exit 0;
else
echo "[$ID]" >> /etc/yum.repos.d/${FILENAME}.repo
fi
read -p "Please input Name:" NAME
echo "name=$NAME" >> /etc/yum.repos.d/${FILENAME}.repo
read -p "Please input baseurl:" BASEURL
echo "baseurl=$BASEURL" >> /etc/yum.repos.d/${FILENAME}.repo
echo "enable=1" >> /etc/yum.repos.d/${FILENAME}.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/${FILENAME}.repo
let I=$I+1
echo $I
done
fi
fi