shell编程——让你又爱又恨的东西

变量类型:

     不同的数据类型在系统中所占资源不同,并且表示的范围也不同

     数值型:

         短整型short:

              占2个字节:-32768~32767

         整型int:

              占4个字节:-2147483648~-2147483647

         长整型long:

              占用4个字节(32位)

              占用8个字节(64位)

         单精度浮点型float:

              占4个字节,精度低,有效位7位

         双精度浮点型double:

              占8个字节,精度高,有效位16位

     字符型:

         char:

              占1个字节

         string:

              字符串类型,存储的不再是单一的字符,而是字符串

        

位置变量

     $0:脚本文件路径自身

     $1:跟随在脚本名后面的第一个参数

     $2:跟随在脚本名后面的第二个参数

     $#:脚本参数的个数

     $@:所有脚本参数,全部参数每个都为独立字符串

     $*:所有脚本参数,全部参数合为一个字符串

[root@www bin]# cat test.sh
#!/bin/bash
#description understanding $0 $1 $2 $# $@ $*
#version 0.1
#author gm
#date 20160811
#
#output $0
echo "this script name is $0"
#output $1
echo "this script first arg is $1"
#output $2
echo "this script second is $2"
#output $#
echo "this script all arg number is $#"
#output $@
echo "this script all arg is: $@"
#output $*
echo "this script all arg is: $*"
[root@www bin]# ./test.sh root gao
this script name is ./test.sh
this script first arg is root
this script second is gao
this script all arg number is 2
this script all arg is: root gao
this script all arg is: root gao

脚本练习:

1、编写脚本/root/bin/systeminfo.sh,示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

#!/bin/bash
#descripation 
#version 0.1
#author gaomeng
#date 20160810
#显示hostname
echo "this host name is :$(hostname)"
#显示系统ip地址
ip=`ifconfig | sed -n '2p' |sed  's@.*addr:\(.*\)B.*@\1@'`
echo "ip address is : $ip"
unset ip
#显示系统版本
echo "this system is :$(cat /etc/centos-release)"
#显示内核版本
echo "this kernel is :$(uname -r)"
#显示cpu型号
echo "this cpu is :$(lscpu | grep name | sed 's@.*[[:space:]]\+@@')"
#显示内存大小
echo "this free is : $(free -m | sed -n 2p | tr -s ' ' | cut -d' ' -f2)MB"
#显示硬盘大小
echo "this Hard disk is :$(lsblk | grep '^sda' | tr -s ' ' | cut -d' ' -f4)"


[root@www bin]# systeminfo.sh
this host name is :www.gao.com
ip address is : 10.1.252.103  
this system is :CentOS release 6.8 (Final)
this kernel is :2.6.32-642.el6.x86_64
this cpu is :Graphics
this free is : 980MB
this Hard disk is :200G

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

#!/bin/bash
#description every day cp /etc/* to /root/.
#version 0.1
#author gm
#date 20160810
echo "beginnig copy /etc/* file"
cp -a /etc /root/etc`date +%F`
echo "finish copy /etc/* file"


[root@www bin]# backup.sh
beginnig copy /etc/* file
finish copy /etc/* file
[root@www bin]# ll -d /root/etc2016-08-11/
drwxr-xr-x. 126 root root 12288 Aug 11 11:17 /root/etc2016-08-11/

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

#!/bin/bash
#description show max shiyonglv of Hard disk
#version 0.1
#author gm
#date 20160810
echo "begin find max shiyonglv of Hard disk"
#find Hard disk is used most
echo "Hard disk is used most :`df | grep -v  "^/dev/sr0" | tr -s ' ' | cut -d' ' -f5 | cut -d% -f1 | sort -nr | head -1`"
echo "END-------------------------"


[root@www bin]# disk.sh
begin find max shiyonglv of Hard disk
Hard disk is used most :26
END-------------------------

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

#!/bin/bash
#description  统计远程连接的ip和连接数
#version 0.1
#author gm
#date 20160810
echo "begin find links"
#tongji ip and links
who | tr -s ' ' | cut -d' ' -f5 | cut -d'(' -f2 | cut -d')' -f1 | sort | uniq -c | sort -rn


[root@www bin]# links.sh
begin find links
      2 10.1.250.25
      1 :0

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

#!/bin/bash
#description /etc/passwd user10 sum user20
#version 0.1
#author gm
#date 20160810
#get user10 uid and user20 uid
id_1=`sed -n '10p' /etc/passwd | cut -d: -f3`
id_2=`sed -n '20p' /etc/passwd | cut -d: -f3`
#uid10 sum uid20
let sum_id=$id_1+$id_2
echo "user10 sum user20 = $sum_id"
#unset
unset id_1
unset id_2
unset sum_id


[root@www bin]# sumid.sh
user10 sum user20 = 180

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

#!/bin/bash
#description tongji two file space lines
#version 0.1
#author gm
#date 20160810
#get file space lines
spaceline1=`grep "^[[:space:]]*$" $1 | wc -l | cut -d' ' -f2`
spaceline2=`grep "^[[:space:]]*$" $2 | wc -l | cut -d' ' -f2`
#sum two files lines
let sumspaceline=$spaceline1+$spaceline2
echo "space lines is : $sumspaceline"
#unset
unset spaceline1
unset spaceline2
unset sumspaceline


[root@www bin]# sumspace.sh /etc/fstab /etc/rc.d/init.d/functions
space lines is : 107

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

#!/bin/bash
#description tongji etc var usr file numbers
#version 0.1
#author gm
#date 20160810
#get etc var usr file numbers
file_etc=`ls -l /etc | wc -l`
file_var=`ls -l /var | wc -l`
file_usr=`ls -l /usr | wc -l`
#sum file numbers
file_sum=$[file_etc+file_var+file_usr]
echo "etc var usr sum file is : $file_sum"
#unset
unset file_sum
unset file_etc
unset file_var
unset file_usr


[root@www bin]# sumfile.sh
etc var usr sum file is : 316

8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

#!/bin/bash
#description file space lines
#version 0.1
#author gm
#date 20160810
#file space lines
[ $# -lt 1 ] &&  echo "please give one argments or more "  || echo " `basename $1` space lines is :`grep -c '^[[:space:]]*$' $1 `"


[root@www bin]# argsnum.sh
please give one argments or more
[root@www bin]# argsnum.sh /etc/fstab
 fstab space lines is :1

9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

#!/bin/bash
#description ping ip address
#version 0.1
#author gm
#date 20160810
#get one arg and ping arg
ping $1 -c1 -W1 &> /dev/null && echo "$1 is up" || echo "$1 is down"


[root@www bin]# hostping.sh 10.1.0.2
10.1.0.2 is down
[root@www bin]# hostping.sh 10.1.0.1
10.1.0.1 is up

10、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满

#!/bin/bash
#description find disk or inode is used more 80%
#version 0.3
#author gm
#date 20160810
#disk or inode is more 80%?
echo "now: finding more 80% disk or inode."
df | grep 'sd' | tr -s ' ' | cut -d' ' -f1,5 | grep -E '\<([89][0-9]|100)\>' ||  df -i | grep 'sd' | tr -s ' ' | cut -d' ' -f1,5 | grep -E '\<([89][0-9]|100)\>' &> /dev/null
[ $? -ne 0 ] && echo "no disk and disk inode is used more 80%" && exit
#find more 80% of disk or inode
diskuse=`df | grep 'sd' | tr -s ' ' | cut -d' ' -f1,5 | sed 's@%@@' | grep -E '\<([89][0-9]|100)\>'`
diskuse="DISK:$diskuse "
inodeuse=`df -i | grep 'sd' | tr -s ' ' | cut -d' ' -f1,5 | sed 's@%@@'| grep -E '\<([89][0-9]|100)\>'`
inodeuse="INODE:$inodeuse"
#to root mail of disk or inode information
echo "$diskuse :: $inodeuse :: is used 80% or 80%+" > /root/bin/inodeuse.txt && mail -s "System mail,this is every important." root <  /root/bin/inodeuse.txt
echo "some disk or inode is more 80%, please into mail see."
#unset
unset diskuse
unset inodeusr


[root@www bin]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda2       50264772 10636332  37068440  23% /
tmpfs             502068      224    501844   1% /dev/shm
/dev/sda1         194241    34192    149809  19% /boot
/dev/sda3       20027260  4902976  14100284  26% /testdir
[root@www bin]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      3203072 141793 3061279    5% /
tmpfs           125517      5  125512    1% /dev/shm
/dev/sda1        51200     39   51161    1% /boot
/dev/sda3      1281120   4080 1277040    1% /testdir
[root@www bin]# disk-use.sh
now: finding more 80% disk or inode.
no disk and disk inode is used more 80%
[root@www bin]# todisk.sh
120+0 records in
120+0 records out
125829120 bytes (126 MB) copied, 2.91644 s, 43.1 MB/s
[root@www bin]# cat todisk.sh
#!/bin/bash
#
dd if=/dev/zero of=/boot/gmtest bs=1M count=120
[root@www bin]# disk-use.sh
now: finding more 80% disk or inode.
/dev/sda1 86%
some disk or inode is more 80%, please into mail see.
[root@www bin]# mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 12 messages 1 new
    1 root                  Wed Aug 10 22:36  19/652   "System mail,this is every important."
    2 root                  Wed Aug 10 22:36  19/665   "System mail,this is every important."
    3 root                  Wed Aug 10 22:44  19/685   "System mail,this is every important."
    4 root                  Wed Aug 10 22:46  19/674   "System mail,this is every important."
    5 Anacron               Thu Aug 11 08:35  18/665   "Anacron job 'cron.daily' on CentOS6.localdomain"
    6 root                  Thu Aug 11 15:02  23/683   "System mail,this is every important."
    7 root                  Thu Aug 11 15:05  19/621   "System mail,this is every important."
    8 root                  Thu Aug 11 15:11  19/608   "System mail,this is every important."
    9 root                  Thu Aug 11 15:13  19/620   "System mail,this is every important."
   10 root                  Thu Aug 11 15:14  19/620   "System mail,this is every important."
   11 root                  Thu Aug 11 15:17  19/620   "System mail,this is every important."
>N 12 root                  Thu Aug 11 16:23  18/609   "System mail,this is every important."
& 12
Message 12:
From root@www.gao.com  Thu Aug 11 16:23:53 2016
Return-Path: <root@www.gao.com>
X-Original-To: root
Delivered-To: root@www.gao.com
Date: Thu, 11 Aug 2016 16:23:52 +0800
To: root@www.gao.com
Subject: System mail,this is every important.
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: root@www.gao.com (root)
Status: R
DISK:/dev/sda1 86  :: INODE: :: is used 80% or 80%+

11、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限

#/bin/bash
#description give one *.sh and add x
#version 0.1
#author gm
#date 20160810
read -p "input one file lujing : " file
#if file is not exist, echo xinxi
[ ! -e $file ] &&  echo "please one true file lujing" && exit 20
#if file is exist, test file is .sh file and chmod +x ,else echo xinxi
echo `basename $file` | grep '\.sh$' &> /dev/null && ( chmod +x $file ; echo "chmod `basename $file` add x" ) || echo "`basename $file` is not .sh"


[root@www bin]# touch /root/nox.sh
[root@www bin]# touch /root/nox
[root@www bin]# ll /root/nox /root/nox.sh
-rw-r--r--. 1 root root 0 Aug 11 16:27 /root/nox
-rw-r--r--. 1 root root 0 Aug 11 16:27 /root/nox.sh
[root@www bin]# chmod1.sh
input one file lujing : /root/no
please one true file lujing
[root@www bin]# chmod1.sh
input one file lujing : /root/nox
nox is not .sh
[root@www bin]# chmod1.sh
input one file lujing : /root/nox.sh
chmod nox.sh add x
[root@www bin]# ll /root/nox /root/nox.sh
-rw-r--r--. 1 root root 0 Aug 11 16:27 /root/nox
-rwxr-xr-x. 1 root root 0 Aug 11 16:27 /root/nox.sh

12、判断输入的IP是否为合法IP

#!/bin/bash
#description input ip useful or no useful
#version 0.1
#author gm
#date 20160810
read -p "please input one useful ip:" ip_addr
echo $ip_addr | grep -E "(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" &> /dev/null  && echo "this is a useful ip" || echo "this is not useful ip"


[root@www bin]# read3.sh 0.0.0.0
please input one useful ip:^C
[root@www bin]# read3.sh
please input one useful ip:0.0.0.0
this is a useful ip
[root@www bin]# read3.sh
please input one useful ip:255.255.255.255
this is a useful ip
[root@www bin]# read3.sh
please input one useful ip:255.256.0.1
this is not useful ip
[root@www bin]# read3.sh
please input one useful ip:0.255.20.256
this is not useful ip

13、计算1+2+3+…+100的和

#!/bin/bash
#description 1 until 100 sum.
#version 0.1
#author gm
#date 20160810
echo  "jisuan 1 until 100 sum."
#jisuan 1 dao 100 de sum
sum=`seq 1 100`
sum=`echo $sum | tr -t ' ' '+'`
sum=$[$sum]
echo "1 until 100 sum is :$sum"
#unset
unset sum


[root@www bin]# read4.sh
jisuan 1 until 100 sum.
1 until 100 sum is :5050

14、输入起始值A和最后值B,计算从A+(A+1)…+(B-1)+B的总和

#!/bin/bash
#description jisuan suiji de two number and two zhijian de number sum.
#version 0.1
#author gm
#date 20160810
#input two number
echo  "pleaes two numbers; and minnumber dao maxnumber de he"
read -p "one number is:" num1
read -p "two number is:" num2
#num1 > num2 exit
[ $num1 -gt $num2 ] && echo "num1 > num2" && exit 2
#num1 until num2 sum
sum=`seq $num1 $num2`
sum=`echo $sum | tr -t ' ' '+'`
sum=$[$sum]
#input sum
echo "$num1 until $num2 sum  is :$sum"
#unset
unset sum
unset num1
unset unm2

[root@www bin]# read5.sh
pleaes two numbers; and minnumber dao maxnumber de he
one number is:8
two number is:4
num1 > num2
[root@www bin]# echo $?
2
[root@www bin]# read5.sh
pleaes two numbers; and minnumber dao maxnumber de he
one number is:4
two number is:8
4 until 8 sum  is :30


原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/33355

(0)
megedugaomegedugao
上一篇 2016-08-12
下一篇 2016-08-12

相关推荐

  • 2016全球运维大会,优云蒋君伟演讲“CMDB+自动化的管理融合”成一大亮点

    2016全球运维大会于9月23日-24日在上海盛大开幕。作为国内运维行业的重量级大会,优云产品总监蒋君伟在自动化专场与来自全国各地的运维同行一起探讨、分享业内自动化运维的最佳实践。现场情绪热烈,气氛高涨,成为了本届全球运维大会的一大亮点。 全新梳理自动化与CMDB的融合之道 全球运维大会当天,运维自动化专场很多大牛针对自动化运维管理中的CMDB进行了激烈的讨…

    Linux资讯 2016-12-05
  • 8.3号,第6天

    三种权限rwx对文件和目录的不同意义: 权限对于目录的意义: 1,r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意:仅仅指的是名字。 2、w权限:拥有此权限表示具有更改该目录结构列表的权限,总之,目录的w权限与该目录下的文件名或子目录名的变动有关,注意:指的是名字。具体如下:      …

    Linux干货 2016-08-05
  • 对虚拟机键入Ctrl+Alt+Delete的详细说明

            日常中我们用Windows系统时经常使用Ctrl+Alt+Delete来换出任务管理的菜单,进行任务管理,linux中也有这样的键入命令,但不是管理任务,而是重启系统!!!那么我们就应该注意了,不要误操作重启服务器。       &n…

    2017-03-28
  • keepalived双主模型高可用Nginx服务

    配置前提: (1) 各节点时间必须同步;             ntp, chrony (2) 确保iptables及selinux不会成为阻碍; (3) 各节点之间可通过主机名互相通信(对KA并非必须);   &nb…

    2017-07-06
  • CentOS、RHEL及Linux的关系

    什么是Linux?    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux存在着…

    Linux干货 2016-01-14
  • Shell脚本编程之入门基础(一)

    Shell脚本编程   一、本章节一内容:    编程基础    脚本基本格式    变量    运算    条件测试   在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我…

    Linux干货 2016-08-12

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 14:33

    文章层次感清晰,通过练习加深了自己对变量的理解。