2016/08/11:初涉shell脚本编程

感悟 : 

  经过对文本处理工具grep,sed等内容的,以及vim文本编辑器的学习,马不停蹄的又进行了对shell脚本的学习。对shell脚本的认识是可以保存在本地,用的时候只要执行相关脚本,简短的命令就可以完成操作,可以用来应对日常重复性工作,有效提高系统管理员的效率,避免在重复性工作上花费不必要的时间。


*************************************************************************************

shell脚本的用途有:
  自动化常用命令
  执行系统管理和故障排除
  创建简单的应用程序

  处理文本或者文件


示例

    #!/bin/bash

    #author:LH

    #Version:1.0

    #Description:This script displays some imformation about your system.


脚本编辑完成后,需要进行几个步骤,确保可以正确执行

    1.chmod +x script或 bash script

    2.bash -n script 检查脚本中语法错误

    3.bash -x 调试执行,按照脚本顺序


变量 :实际就是命名的内存空间


编程语言分类

    强类型 :定义变量时要指定类型,java,python等

    弱类型 :无需提前指定类型,可直接调用

    

    变量命名规则:

        不能使用和保留字相同的名字

        只能使用数字字母下划线,数字不可开头

        见名知意

        驼峰命名法:大小驼峰


变量种类

        1.本地变量 作用范围为当前shell进程,对其他进程,以及子shell无效

        2.环境变量 作用范围是当前shell及其子进程

        3.局部变量 作用范围为当前shell某段(一般是函数)

        4.位置变量 $1 $2 $3 …用于让脚本在脚本代码中调用传入的参数

        5 特殊变量

                $? 上次命令执行状态

                $0 在脚本内部引用脚本名称本身

                $# 传递给当前脚本的参数的个数

                *************

                $* 和$@:表面的意思相同,都是表示传递给当前脚本的所有参数

                    区别:

                           $* 把所有参数看做一条字符串

                           $@ 所有参数让当做单独的字符串

    

引用方式

        变量引用 name="$USER",不可使用''

        命令引用 name=`CMD` =$(CMD)       

    

显示所有变量 set

删除变量 :unset name ,通常用于脚本末尾,释放变量的命名空间,有利于内存合理使用


*********************************************

环境变量声明、赋值

        ecport name=value

        declare -x name=VALUE

     引用方式和本地变量相同        

  

显示所有环境变量:

    export    

    env

    printenv

删除变量:unset name

bash 的内置环境变量

    PATH 环境变量   

    SHELL

    USER 当前用户

    UID 当前用户UID

    HISTSIZE 历史命令保存数目

    HOME

    PWD 当前目录

    OLDPWD 前一个目录

    HISTFILE 历史文件路径

    PS1       

   PPID 父目录


只读变量:只能读,但不能修改删除

    

》》》》》》》》》》》》》》》》》》》》》》

算数运算

    ** 乘方

    实现

        1.、let var=2+8 –>echo $var

        2. echo '2+8'|bc  

        3. echo $[$RANDOM%50] 0-49间随机数   

      

赋值

    let var++ 先赋值,再运算

    let ++var 先运算,再赋值

 

    +=自加,-=,*=,/= %=

 

逻辑运算:

    与:都为1时,才为1

    或:都为0时,才为0

    

   短路运算:

        与

            

        或

   异或 

    相同为假,相同为真

聚集命令,就是;连接,然后按照从左至右顺序一个一个运行


条件性的执行操作符

    && – -AND THEN

    || – -OR ELSE

     $ grep -q no_such_user /etc/passwd \

        || echo 'No such user'  \为换行执行



*************************

数值测试

    -gt

    -ge

    -lt

    -le

    -ne 是否不等于

    -eq 是否等于


字符串测试

    > ASCLL 是否大于

    'string'=~ /pattern/ 左侧字符串是否被右侧PATTErn匹配到

    -z "string" 字符串是否为空,空为真,不空为假

    -n 与-z相反 


文件测试

    -e -a 文件存在为真,否为假

    -L 是否存在且为符号链接文件

    -p 管道文件

    -S 是否存在且为套接字文件

文件权限测试

    -r

    -w

    -x 是否存在且可执行


特殊权限测试

    -g sgid

    -u 是否存在且拥有suid

    -k 是否存在sticky权限


文件大小测试

    -s FILE:是否存在且非空


文件是否打开

    -t fd 表示文件描述符是否已经打开且与某终端相关

    -N FILE:文件自上次读取之后是否被修改过

    -O FILE 当前用户是否为文件属主

    -G  是否为文件属组


双目测试:

    FILE1 -ef FILE2:1和2是否指向同一个设备上的相同inode

    

组合条件测试

    1.CMD1 && CMD 2 并且

        CMD1 || CMD 2 或者

    2.

    -a 并且

    -o 或者

    必须使用测试命令 ,test



*************************************

*************************************

**********************************8**    

练习

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

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

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

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

 netstat -nt |tr -s ' '|cut -d' ' -f5|tr -cs '0-9.' '\n'|egrep '([0-9]+.){3}[0-9]+'|uniq -c|sort -nr|tr -s ' ' '\t'

2 172.18.19.48

1 10.1.250.94

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

echo `sed -n -e 10p -e 20p /etc/passwd|cut -d: -f3|tr '\n' +|sed -r 's@(.*)\+@\1@'`|bc

sed -n -e 10p -e 20p /etc/passwd 

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

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

7、写一个脚本/root/bin/argsnum.sh,

接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,

并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

8、写一个脚本/root/bin/hostping.sh,

接受一个主机的IPv4地址做为参数,测试是否可连通

。如果能ping通,则提示用户“该IP地址可访问”;

如果不可ping通,则提示用户“该IP地址不可访问”

9、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,

判断当前用户对/tmp/fiile1文件是否不可读且不可写

10、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

[ -f /etc/nologin ] && echo "user disable login already" || (touch /etc/nologin; echo user disable login )

[ -f /etc/nologin ] && (rm -f /etc/nologin;echo user enable login) ||  echo user disable login already

11、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,

否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

12、计算1+2+3+…+100的值

13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

    




    


                


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

(0)
上一篇 2016-08-16 13:59
下一篇 2016-08-16 13:59

相关推荐

  • Linux Shell(脚本)编程入门

    为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建…

    Linux干货 2017-08-05
  • Linux创建CA和申请认证

    Linux创建CA和申请认证 背景: 在学习Linux运维中,学习到了CA的创建和申请认证,为了加深对CA的理解,这里做一个创建CA和申请认证的实验并记录下来供以后回顾。 介绍: 什么是CA认证? 电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任…

    2017-09-09
  • VIM编辑器用法及练习

    VIM编辑器用法及练习 什么是vim? vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。 Vim的第一个版本由布莱姆·米勒在1991年发布。最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。现…

    Linux干货 2016-10-30
  • Linux发展及OS基础

    开源协定:          GPL  LGPL,Apache,BSD          BSD:      …

    Linux干货 2016-08-08
  • 超文本传输安全协议—HTTPS

        超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。H…

    Linux干货 2017-08-07
  • 树的遍历和排序

    树的遍历和排序

    Linux干货 2017-10-23