Shell脚本编程初步

    shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但shell和shell script是两个不同的概念。shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。shell脚本运行时启动解释器,由解释器边解释边运行,当前主流的操作系统都支持shell编程,Linux默认安装就带了shell解释器。bash脚本解释器,在centos里,/bin/sh是一个指向/bin/bash的符号链接;

]#ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 8月   2 03:38 /bin/sh -> bash

    


编写脚本;打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

#!/bin/bash
#

    脚本编程文件格式

    #!/bin/bash

    #daecription:脚本描述

    #version:版本信息

    #author:作者

    #date:日期

   “#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

    脚本运行;给予脚本文件可执行权限,然后./脚本名称或者直接运行bash 脚本名称也可运行

    除了顶格的shebang所有以#号开头的行都会被忽略


变量

    定义变量

        定义变量时,变量名和等号之间不能有空格,变量名不加美元符号($),如:

]#youname=ali

   使用变量

        使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

]#echo $youname
ali

        变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,如果不加花括号就会出现下边情况

]#echo "the is $younamehello"
the is

        推荐给所有变量加上花括号,这是个好的编程习惯。

]#echo "i need ${youname}number"
i need alinumber

    变量可以被重复定义赋值

]#name=ali
]#echo $name
ali
]#name=Aisha
]#echo $name
Aisha


算术运算

    有时候经常要在脚本中用到算术运算,方法很多

    +,-,*,/,%,**

let VAR=expression

]#i=1
]#j=2
]#let sum=$i+$j
]#echo $sum 
3

$[expression] 注:此算法格式中$可省略,如:

]#sum=0
]#sum=$[i+j]
]#echo $sum
3

$((expression))

]#sum=0
]#sum=$(($i+$j))
]#echo $sum 
3

expr argu1 argu2 argu3 注:此运算格式的运算符号需要用空格间隔开,

]#expr 10 + 10 + 10
30

    有些时候乘法符号需要转义,如

]#expr 10 \* 10
100

增强型赋值:

    变量做某种算术运算后回存至此变量中;

    let i=$i+#,-,*,/,%,**(个人倾向此种格式)注意;有些时候运算符号需要转义

]#i=1
]#let i=$i+2
]#echo $i
3

    let i+=#

]#i=1
]#let i+=1
]#echo $i
2

    +=,-=,*=,/=,%=

自增运算:

    VAR=$[$VAT+1]

    let VAR+=1

    let VAR++

]#i=1
]#let i++
]#echo $i
2

自减运算:

    VAR=$[$VAT-1]

    let VAR-=1

    let VAR–

]#i=3
]#let i--
]#echo $i
2


条件测试 

    Linux 的Shell中存在一组测试命令,该组命令用于测试某种条件或某几种条件是否真实存在。测试命令是判断语句和循环语句中条件测试工具,所以,其对于编写Shell脚本非常重要。判断某需求是否满足,需要有测试机制来实现;

测试结构

    测试命令用于测试表达式的条件的真假。如果测试的条件为真,则返回一个0值;如果测试条件为假,将返回一个非0整数值。

    测试命令有三种结构,一种是用test命令进行测试,结构如下:

    test EXPRESSION;

    [ EXPRESSION ]

    [[ EXPRESSION ]]

    其中,条件expression是一个表达式,该表达式可为数字、字符串、文本和文件属性的比较,同时可同时加入各种算术、字符串、文本等运算符。为了提高命令的可读性,经常使用第二种格式。

    第一种

]#i=5
]#test $i -eq 5
]#echo $?
0

    第二种

]#i=5
]#[ $i -eq 5 ]
]#echo $?
0

    第三种:此方法多用在字符测试情况下使用,因为此方法多会因为标点符号的原因报错,不推荐使用,推荐第二种。

]#name=ali
]#[[ $name == ali ]]
]#echo $?
0

    第二种方法测试字符示例

]#name=ali
]#[ $name == ali ]
]#echo $?
0


bash的测试类型

    数值测试 ;数值比较       

    -eq:是否等于;[$num1 -eq $num2]

    -ne:是否不等于;

    -gt:是否大于;

    -ge:是否大于等于

    -lt:是否小于

    -le:是否小于等于;

    示例如下;注;退出状态为0,表示num等于13;反之,退出状态为非0.

]#num=233
]#[ $num -eq 233 ]
]#echo $?
0

    字符串测试:字符比较

    ==:是否等于;

    >:是否大于

    <:是否小于

    !=:是否不等于

    =~:左侧的字符串是否能够被右侧的pattern所匹配

    -z"string":判断指定的字串是否为空;空则为真,不空则假

    -n"string":判断指定的字串是否不空,不空则真,空则为假;

    注意:有些时候(1)字符串要加引用;(2)要使用双中括号[[]];

     示例;

]#name=ali
]#name1=Aisha
]#[[ $name == $name1 ]]
]#echo $?
1

    文件测试        

     存在性测试(文件的存在性测试,存在则为真,否则则为假)

    -a file

    -e file

    示例

]#touch test
]#[ -a test ]
]#echo $?
0

    存在性及类型测试

-b file:是否存在并且为 块设备文件;

-c file:是否存在并且为 字符设备文件;

-d file:是否存在并且为 目录文件;

-f file:是否存在并且为 普通文件;

-h file或-L file:是否存在并且为符号链接文件;

-p file:是否存在且为 命名管道文件

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

    示例;

]#[ -d /etc/ ]
]#echo $?
0

    文件权限测试

-r file:是否存在并且对当前用户可读;

-w file:是否存在并且对当前用户可写;

-s file:是否存在并且对当前用户可执行;

]#ll file
----------+ 1 root root 0 8月  21 11:15 file
]#chmod u+r file
]#ll file
-r--------+ 1 root root 0 8月  21 11:15 file
~]$ [ -r /testdir/file ]
[hacker@السلام عليكم ~]$ echo $?
1    注:所有权限对root都形同虚设,此处普通用户测试对此文件没有r的权限

    特殊权限测试

-g file:是否存在并且拥有sgid权限

-u file:是否存在并且拥有suid权限

-k file:是否存在并且拥有sticky权限

    文件是否有内容

-s file:文件是否有内容

    从属关系;

-O file:当前用户是否为文件的属主

-G file:当前用户是否属于文件的属组

双目测试;

file1 -ef file2:file1与file2是否为执行同一个文件系统上的相同inode的硬链接

filr1 -nt file2:file1是否新于file2

file1 -ot file2:file1是否旧于file2


组合测试条件

    逻辑运算符用于测试多个条件是否为真或为假,或使用逻辑非测试单个表达式,这些运算符在Shell编程中经常用到,这些条件一般和测试命令联用。

             逻辑操作符

逻辑操作                            描述

!expression           如果expression为假,则测试结果为真

expression1 –a expression2   如果expression1和expression2同时为真,则测试结果为真

expression1 –o expression2   如果expression1和expression2有一个为真,则测试结果为真

其中expression为表达式,该表达式描述了一个测试条件。在逻辑运算符表达式中并不是所有的运算符都会被执行。

例:expr1 –a expr2 –a expr3

只有当expr1为真时,才会测试expr2,依次。逻辑或运算符类似。

例:[ -e file_exam –a –x file_exam ]

  [ “$integer1” –lt 20 –o “integer1” –gt 30 ]

注:当逻辑非运算符和表达式之间要有空格。(此部分摘抄自网络)


逻辑运算

第一种方式

cmd1 && cmd2

cmd1 || cmd2

!cmd

[-O FILE] && [-r FILE](测试文件是否存在并且可读)

第二种方式

[[EXPRESSION(表达式)1 -a EXPRESSION2]]

[[EXPRESSION(表达式)1 -O EXPRESSION2]]

!EXPRESSION

[-O FILE -a -x file]

]#[ -a file -a -r file ]
]#echo $?
0

   

      

原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/38202

(0)
M20-1马星M20-1马星
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • 马哥教育网络班21期+第五周博客作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@C67-X64-A0 ~]# grep "^[[:space:]]\+" /boot/grub/grub.conf      root (hd0,0…

    Linux干货 2016-08-05
  • systemd

    systemd的新特性(centos 7) 系统引导时实现服务并行启动 按需激活进程,在此之前可以让进程处于半活动状态 系统状态快照:能够自我保存当前系统上没一个用户空间的进程运行状态快照,将来可以迅速恢复到某一种状态,因此用户空间有了时间机器。可以回滚到过去某一时刻的状态 内在的基于依赖关系定义的服务控制逻辑 对与systemd来讲,引入了一个新的核心概念…

    Linux干货 2016-09-23
  • shell脚本之选择与执行

    流程控制  过程式编程语言: 顺序执行 选择执行 循环执行 选择执行:if语句  注意:if语句可嵌套  单分支 if 判断条件:then 条件为真的分支代码 fi  双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if…

    Linux干货 2016-09-19
  • 如何练好yum的一招一式

      工作时间越久,就越有这样一个深刻体会,一个新知识或者新的技能一个人学习起来并不会觉得吃力,反而要想把你学习的新知识或者新技能给讲清楚让普通人听得懂才是最难的,之前我写过一篇博客讲述linux下的RPM包管理器,今天写的练好yum的一招一式,同样都是都是在linux系统的软件包的安装、卸载、升级等功能的,为什么我们还需要yum那,记得一位大哲学家…

    Linux干货 2015-11-10
  • 马哥教育网络班21期+第17周课程练习

    1、结合图形描述LVS的工作原理; lvs是基于内核的虚拟主机用来做四层的负载均衡,工作在netfilter框架的INPUT链上,有四种模式,上图为lvs-nat lvs-nat:有DNAT功能,支持端口映射,请求报文和响应报文都需要经过Director 请求过程:cip–>vip,Director,cip–>rip 响应…

    Linux干货 2016-12-26
  • 计算机及Linux系统基础简介

    一、计算机的组成及其功能 计算机由运算器,控制器,存储器,输入装置和输出装置五大部件组成计算机,每一部件分别按要求执行特定的基本功能。 运算器或称算术逻辑单元(Arithmetical and Logical Unit) 运算器的主要功能是对数据进行各种运算。这些运算除了常规的加、减、乘、除等基本的算术运算之外,还包括能进行“逻辑判断”的逻辑处理能力,即“与…

    Linux干货 2017-07-02