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

相关推荐

  • yum相关知识及源码编译安装http

    二.源码编译安装http 获得源码,将源码放在/usr/local/src下,并将其解压缩到此目录下 进入解压缩文件下,查看INSTALL文件 文件内容如下 黄色区域即为安装步骤 在当前目录下执行./configure –prefix=/usr/local/appach2 编译  make make install  把目标文…

    系统运维 2016-08-24
  • N22-第八章作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。       网桥:网桥是工作在数据链路层的设备。用于将两个LAN连接在一起并按照Mac地址转发数据。网桥保存着所有与它相连的主机的Mac地址表和端口号并具有学习功能。当网桥收到某个数据包后,能根据目的主机的Mac地址再选择从哪个端…

    Linux干货 2016-10-24
  • 使用groupmems -l -g 组名选项遇到的问题

    groupmems -l -g 组名 显示的不是附加组的成员,而是显示的是/etc/group文件的最后一个字段的内容

    Linux干货 2017-11-23
  • PXE实践

    本篇只以记录个人部署pxe过程中所遇问题,至于原理,只做部分简单说明。 pxe部署必要软件: syslinux (用于提供引导中所必备文件) tftp(用于提供存放vmlinuz,initrd,syslinux.0等引导类文件) dhcp(用于自动获取IP包括指明去哪个主机获取syslinux.0文件) 最后还需要一个web或者ftp服务,已提供系统安装中所…

    Linux干货 2017-02-05
  • 马哥教育网络19期+第十六周课程练习

    编译安装LNMP 一、安装Nginx: 1、解决依赖关系 编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包: # yum -y ins…

    Linux干货 2016-08-22
  • N26_第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 演示: [root@joylin test]# who|cut -d” ” -f1|uniq root gentoo [root@joylin test]# who|cut -d” ” -f1|uniq -c 5 root 1 gentoo 或者 [root@joyl…

    Linux干货 2017-02-21