(注)$@和$*的区别,以及$0..$n
[root@ _6_ ~]# cat weizhi.sh #!/bin/bash echo "\$* is :$*" echo "\$@ is :$@" echo "\$# is :$#" echo "打印\$*" for i in "$*"; do echo "$i" done echo "打印\$@" for k in "$@"; do echo "$k" done echo "$0 $1 $2 $5 $4 $5" [root@ _7_ ~]# bash weizhi.sh 1 2 3 4 5 $* is :1 2 3 4 5 $@ is :1 2 3 4 5 $# is :5 打印$* 1 2 3 4 5 打印$@ 1 2 3 4 5 weizhi.sh 1 2 3 4 5 $0为脚本名称,包括路径 $1..$n为脚本的第n个参数 $#为脚本参数个数 $*和$@是所有的脚本参数 在被双引号引起来时: $* 所有参数是一个整体 $@ 每个参数是独立个体
作业:
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名, IPv4地址,操作系统版本,内核版本,
CPU型号,内存大小,硬盘大小。
#!/bin/bash echo "主机名为:`uname -n`" echo "ip为:`ip addr|egrep -A2 "^[[:digit:]]+"|sed 'n;d'|sed -n 'n;p'|tr -s ' '|cut -d' ' -f1,3`" echo "操作系统版本:`cat /etc/redhat-release`" echo "内核版本号为:`uname -r`" echo "CPU信息为:`cat /proc/cpuinfo |grep "CPU"|sed -r 's/.*:(.*)/\1/'`" echo "内存大小为:`cat /proc/meminfo |grep "MemTotal"|sed -r 's/[^0-9]*([0-9].*)$/\1/'`" echo "硬盘大小为:`fdisk -l|grep "/dev/sd[a-z][::]"`" [root@ _2_ ~/bin/old_dir]# bash systeminfo.sh 主机名为:localhost.localdomain ip为: 127.0.0.1/8 192.168.33.200/24 192.168.122.1/24 操作系统版本:CentOS Linux release 7.2.1511 (Core) 内核版本号为:3.10.0-327.el7.x86_64 CPU信息为: Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz 内存大小为:1001332 kB 硬盘大小为:磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
cat /root/bin/backup.sh #!/bin/bash tar -zcf /root/etc`date +%F`.tar.gz /etc/ crontab -e 00 12 * * * /bin/bash /root/backup.sh
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash df -h |grep -v "/dev/sr0" |awk -F' ' '{print $5}'|tail -n +2|sort|tail -1 [root@ _2_ ~/bin/old_dir]# bash /root/bin/disk.sh 31%
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
netstat -nt|tail -n +3|awk -F' ' '{print $4}'|sort|uniq -c [root@ _34_ ~/bin/old_dir]# netstat -nt|tail -n +3|awk -F' ' '{print $4}'|sort|uniq -c 1 192.168.33.200:22
5:写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
#!/bin/bash id_user10=`sed -n '10p' | cut -d: -f3` id_user20=`sed -n '20p' | cut -d: -f3` sum=$[$id_user20+$id_user10] echo "第十个用户和第二十个用户ID和为:$sum" [root@ _35_ ~/bin/old_dir]# bash sumid.sh 第十个用户和第二十个用户ID和为:70
6:写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中
所有空白行之和
#!/bin/bash [ $# -ne 2 ] && echo "Please input two args !" && exit 2 [ ! -f $1 -o ! -f $2 ] && echo "Please input two file!" && exit 3 file1_space=`grep "^$" $1 |wc -l` file2_space=`grep "^$" $2 |wc -l` sum_space=$[file1_space+file2_space] echo "这两个文件行数为:$sum_space" [root@ _37_ ~/bin/old_dir]# bash sumspace.sh /etc/fstab /etc/issue 这两个文件行数为:2
7:写一个脚本/root/bin/sumfile.sh,统计/etc, /var,/usr目录中共有多少个一级子目录和文件
#!/bin/bash num1=`ls /etc | wc -l` num2=`ls /var | wc -l` num3=`ls /usr | wc -l` sum=$[$num1+$num2+$num3] echo "所有子文件目录和为:$sum" [root@ _38_ ~/bin/old_dir]# bash sumfile.sh 所有子文件目录和为:294
附加:
8、如果磁盘使用率超过80%。使用wall报警
#!/bin/bash max_disk=`df | grep "/dev/sd[a-z]" | awk -F' ' '{print $5}' | tail -n +2 | sort -n |tail -1|cut -d% -f1` [ $max_disk -ge 80 ] && wall disk will be full!
9、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个
参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
#!/bin/bash [ $# -lt 1 ] && echo "至少应该给一个参数" && exit [ -f $1 ] && echo "$1的空白行数为:`sed -n '/^$/p' $1 | wc -l`" || echo "你给的第一个参数不是文件!" [root@ _43_ ~/bin/old_dir]# bash argsnum.sh 至少应该给一个参数 [root@ _44_ ~/bin/old_dir]# bash argsnum.sh 1 你给的第一个参数不是文件! [root@ _45_ ~/bin/old_dir]# bash argsnum.sh /etc/issue /etc/issue的空白行数为:1
10、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提
示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
#!/bin/bash echo "$1" | grep -q "\(\(25[0-4]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9]\?[0-9]\)\.\)\{3\}\(25[0-4]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9]\?[0-9]\)" if [ $? -eq 0 ];then echo "正在尝试连接 $1" ping -c 2 -w 3 $1 >> /dev/null if [ $? -eq 0 ];then echo "地址可达!" else echo "地址不可达!" fi else echo "你给的不是一个IPV4地址!" fi [root@ _47_ ~/bin/old_dir]# bash hostping.sh 你给的不是一个IPV4地址! [root@ _48_ ~/bin/old_dir]# bash hostping.sh 10.2.3 你给的不是一个IPV4地址! [root@ _49_ ~/bin/old_dir]# bash hostping.sh 10.2.255.666 你给的不是一个IPV4地址! [root@ _50_ ~/bin/old_dir]# bash hostping.sh 10.1.0.1 正在尝试连接 10.1.0.1 地址可达! [root@ _51_ ~/bin/old_dir]# bash hostping.sh 10.1.0.2 正在尝试连接 10.1.0.2 地址不可达!
11、 chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件 是否不可读且不可写
#!/bin/bash [ ! -w '/tmp/file1' ] && [ ! -r '/tmp/file2' ] && (echo "当前用户对该文件不可读且不可写!" ; exit) echo "当前用户对该文件 并非 不可读且不可写!"
12、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
禁止普通用户登录 #!/bin/bash touch /etc/nologin 允许普通用户登录 #!/bin/bash rm -rf /etc/nologin
13、计算1+2+3+…+100的值
#!/bin/bash sum=`echo {1..100} |tr ' ' '+'|bc` echo "1+..100的和为:$sum" [root@ _53_ ~/bin/old_dir]# bash jisuan1-100.sh 1+..100的和为:5050
14、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
#!/bin/bash [ ! $# -eq 2 ] && echo "请输入两个参数!" && exit expr $1 + $2 &>/dev/null [ $? -ne 0 ] && echo "你输入的参数中有非整数!" && exit [ ! $2 -gt $1 ] && echo "你输入的第一个参数不小于第二个参数" && exit sum=`seq $1 $2|tr '\n' '+'|sed -r 's@(.*)\+@\1\n@' | bc` echo "两个参数之间的和为:$sum" [root@ _55_ ~/bin/old_dir]# bash bijiaoAB.sh 1 0 你输入的第一个参数不小于第二个参数 [root@ _56_ ~/bin/old_dir]# bash bijiaoAB.sh 0 请输入两个参数! [root@ _57_ ~/bin/old_dir]# bash bijiaoAB.sh 1 9 两个参数之间的和为:45
原创文章,作者:M20-1--孔祥文,如若转载,请注明出处:http://www.178linux.com/35212