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

相关推荐

  • iptables

    规则格式:iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]     -t table:&nb…

    Linux干货 2017-06-16
  • class13 shell编程(五)软件包管理(三)

    一、shell编程(五) 位置变量补充 shift (踢掉参数) shift                #! /bin/bashecho "1st arg …

    Linux干货 2016-08-24
  • N_28 正则表达式的一些基本用法

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ~]# cp -r /etc/skel /home/tuser1 ~]# chmod -R -g— -o— /home/tuser1 2、编辑/etc/group文件,添加组hadoop。 ~]#vi…

    Linux干货 2017-12-23
  • 第二周

    第二周 1. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 cp 复制文件和目录语法格式:cp [OPTION]… [-T] SOURCE DESTcp [OPTION]… SOURCE… DIRECTORYcp [OPTION]… -t DIRECTORY SOURCE&#8230…

    Linux干货 2017-07-21
  • 利用PXE技术批量安装linux系统

    技术背景 对与运维人员来说,如何安装操作系统想必并不陌生;但当我们面对大量需要安装系统的环境时,自动化安装系统就成了一项必备的技能;下面就让我们一起走进PXE这项批量自动化安装操作系统的技术吧。 PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,…

    2017-09-18
  • Linux基础学习总结(一)

    Linux 安装运行步骤: 进入\\172.16.0.1\python10          用户名:python10          密码:python10magedu 进入目录   ftp://172.16.0.1/pub/ISOs/ 下载linux系统镜像文件           CentOS-6.9-x86_64-bin-DVD1.iso     …

    Linux干货 2018-03-16