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