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 13:59
下一篇 2016-08-16 13:59

相关推荐

  • nginx负载均衡搭建

    组 网络拓扑图 nginx负载均衡服务器搭建 首先准备三台机器 主机A(nginx负载均衡器) 主机B 主机C 主机A需两块网卡(一块外网,一块内网) 主机B和主机C各一块 (各一块内网的IP,如果主机B C和主机A内网网卡在一个网段就不需要配置网关地址了。 规划好网络后,nginx负载主机分别ping下各rs主机是否可通 主机A打开核心转发功能 #echo…

    Linux干货 2017-05-17
  • 关于网络配置管理

                                                      &nbsp…

    系统运维 2016-09-07
  • rsync+inotify实现实时同步案例

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,…

    Linux干货 2016-10-30
  • Bash shell 脚本编程全攻略(上篇)

    Bash shell 脚本编程全攻略(上篇)   什么是shell脚本呢? 当命令不在命令行上执行,而是通过一个文件执行时,该文件就称为shell脚本,脚本以非交互的方式运行。Shell脚本把命令通过一些语法组织起来,便能实现特定的功能。   Shell脚本主要运用在系统运维中,主要功能有: 自动化常用命令; 执行系统管理和故障排除; 创…

    Linux干货 2016-08-29
  • N22-第3周作业-冥界之王

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@CentOS6 ~]# who  | cut -d " " -f1 | uniq 2、取出最后登录到当前系统的用户的相关信息。…

    Linux干货 2016-09-19
  • 第二周博客作业

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示 Linux文件管理类命令有cp、mv、rm 1、cp命令:copy files and directories 使用方法: 单源复制cp [OPTION]… [-T] SOURCE DEST1)如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中2)如果…

    Linux干货 2016-12-13