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)
000000
上一篇 2016-08-16
下一篇 2016-08-16

相关推荐

  • linux 下的文件压缩与解压

    文件压缩 压缩原理:把文件的二进制代码压缩,把相邻的0,1代码减少,比如有000000,可以把它变成6个0 的写法60,来减少该文件的空间。 目的:时间换空间,cpu时间–>空间 压缩文件工具:    compress|uncompress 压缩后的文件.z    gzip|gunzip  …

    Linux干货 2016-08-21
  • shell脚本的一点补充

    脚本内容补充 数组 变量:存储单个元素的内存空间数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引 索引:编号从0开始,属于数值索引注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。bash的数组支持稀疏格式(索引不连续) 数组的使用 声明数组: declare -a ARRAY_NAME…

    Linux干货 2016-08-24
  • 特殊权限

    特殊权限 文件特殊权限 一、SUID(4) SUID:当s这个标志出现在文件所有者的x权限上时,就被称作SUID。 SUID的功能和限制:1、仅仅对二进制程序有效; 2、执行者对程序需要X的执行权限; 3、本权限仅仅在执行该程序的过程中有效; 4、执行者将具有该程序所有者的权限。 5、SUID仅仅可以用在二进制程序上,…

    Linux干货 2016-08-05
  • 关于shell脚本编程基础第三篇

                          关于shell脚本编程基础第三篇   本章主要内容:循环的特殊用法;while;for;select 循环与菜单       &nbsp…

    系统运维 2016-08-21
  • N26 第六周作业

    总结vim编辑器的使用 Vim 模式    Vim 有六种基本模式    Normal mode                 Visual mode&nbs…

    Linux干货 2017-02-01
  • N25期–第十周作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 启动过程 (PC架构)    POST –> Boot Sequence(BIOS) –> Boot Loader (MBR)–>GRUB—> Kernel(ramdisk) –> ro…

    Linux干货 2017-03-13