bash脚本初探


 

 

 

 

 

 

 

 

 

 

 

bash脚本.png 

 

(注)$@和$*的区别,以及$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

(0)
M20-1--孔祥文M20-1--孔祥文
上一篇 2016-08-14
下一篇 2016-08-15

相关推荐

  • SHELL编程之数组运用及YUM软件包管理

    SHELL编程中,当要引用到多个值的时候,一个一个地进行变量赋值会让我们的脚本变得繁琐,不利于代码的优化,所以,就需要通过数组进行定义,优化代码,减少不必要的定义和命令操作。 SHELL中的数组:存储多个元素的连续内存空间 数组名:整个属组只有一个名字 数组索引: 编号从0开始   数组名[索引]   ${array_name[index…

    Linux干货 2016-08-24
  • 纯文本配置还是注册表

    我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:一,二),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的…

    Linux干货 2016-08-15
  • Linux 基础(三)——用户管理&正则表达式

    1、  列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who | cut -d " " -f1 | uniq 2、  取出最后登录到当前系统的用户的相关信息。 last -1 | cut -d " " -f1 | head -1 | id 3、  …

    Linux干货 2016-11-08
  • Mysql备份I

    Mysql备份I I备份在什么时候会被需要 硬件故障 机器无法启动 机器突然消失了怎么办 业务出现异常 一定要先select 在操作 类似drop或delete的操作 攻击 程序bug 业务特殊需求  重要数据多处多次多版本备份 至少有2份远程备份文件2处本地备份 II哪些东西需…

    Linux干货 2016-06-09
  • Select、Case

    select循环与菜单 select循环主要用于创建菜单,按数字排序list指定的顺序排序,并列出在标准输出,利用PS3列出提示符进行输入选择 用法: select VARIABLE in list  do     循环体命令 done PS3提示语定义: 在脚本中脚本代码的第一…

    Linux干货 2016-08-21
  • 文件处理工具及正则表达式练习

    本节练习均在centos7系统下实现,部分练习只截取部分截图,另外排版的事情我已经放弃了! 1.找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 注:^ 行首, . 匹配任意单个字符,* 匹配前面的字符任意次 突然发现前面解法错误,没有排除空格后加小括号的情况,下面是正确做法 2.统计last命令中…

    Linux干货 2017-07-29