shell编程
本文主要对一些shell常用知识总结
分隔符使用
if [ -f fliename ];then
...
fi
# 等同于以下
if [ -f fliname ] #不同的语法命令之间要用分号或是换行隔开,可以用换行符替代分割符
then
...
fi # shell语句用fi闭合
由此可见分号是用来隔断每个语法关键字或命令的。对于字符的比较及其他shell语法关键字之间分号的使用方式相同。
需要知道的是在不同的语法命令之间要用分号隔开或是换行方能执行,否则将会在调用脚本的时候报错。
数组应用
[root@cloudhost ~]# name=(hello error)
[root@cloudhost ~]# for i in ${name[@]};do echo $i; done;
shell中用arrary=(arr1 arr2 arr3 ……)
的方式声明数组
访问数组时使用${arrary[@]}
访问整个数组 ,@
表示数组索引表,
使用${p[index]}访问数组中的某个特定的值。
if-then的基本特性和高级用法
基本用法
if [ -x flie ];then # 测试用户是否可执行文件,以下为其他一些测试语句
...
fi
条件测试
-d
测试是否为目录,是则为真(Directory)
-e
测试目录或文件是否存在,存在则为真(Exist)
-f
测试是否为文件,是则为真(File)
-r
测试当前用户是否有权限读取,是则为真(Read)
-w
测试当前用户是否有权限写入,是这为真(Write)
-x
测试当前用户是否可执行该文件,可执行则为真(Excute)
-L
测试是否为符号链接文件,是则为真(Link)
-nt
file1 -nt file2 如果 file1 比 file2 新(修改时间),则为真
-ot
file1 -ot file2 如果 file1 比 file2 旧(修改时间),则为真
字符串比较
=
字符串内容相同则为真,就是说包含的文本一摸一样。
!=
字符串内容不同,则为真(!号表示相反的意思)
-z
字符串内容为空(长度为零)则为真
-n
字符串内容非空(长度非零)则为真
<
string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
>
string2 如果string1在本地的字典序列中排在string2之后,则为真
==注意:==
- 字符串的 “等于” 比较,为了与POSIX一致,在[]
中使用=
,(尽管==
也可以可以用的)
- 注意在=
前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
- 字符串的> <
比较运算符,一般放在[[ ]]
之中,而不是test (“[]”)
- 字符串的> <
比较的结果,与本地的locale有关,是按照其字典序列进行比较的
数值比较
-eq
等于(equal)
-ne
:不等于(not equal)
-gt
:大于(Greater than)
-lt
:小于(lesser than)
-le
:小于等于(lesser or equal)
-ge
:大于等于(Greater or equal)
逻辑测试
-a
或&&
逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假
-o
或||
逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否为为假
!
逻辑否,当制定条件不成立时,返回结果为真
高级特性
由于单括方号不支持表达式,test只支持简单的算术操作,双括号解决了此类问题
用于数学表达式的双括号
格式
(( expression1,expression2 ))
expression可以是任意的数学赋值或比较表达式,如下:val++
后增
val--
后减
++val
先增
--val
先减
!
逻辑取反示例
if (( val ** > 90 )) #用于测试 $(( a>1?8:9 )) #三目运算 $(( a=a+1 )) a=$(( a+1,b++,c++ ))
特点
- 在双括号结构中,所有表达式可以像c语言一样,如:
a++
,b--
等。 - 在双括号结构中,所有变量可以不加入:“$”符号前缀。
- 双括号可以进行逻辑运算,四则运
- 双括号结构 扩展了for,while,if条件测试运算
- 支持多个表达式运算,各个表达式之间用“,”分开
- 在双括号结构中,所有表达式可以像c语言一样,如:
用户高级字符串处理的双方括号
格式
`[[ expression ]]` 双方括号里的expression使用了test中的标准字符串比较,但它提供了test没有提供的特性--`模式匹配`。
示例
``` if [[ $USER == r* ]] #是否是以r开头的行 ```
系统变量
$#
传给shell程序的位置参数个数;
$0
脚本名称;
$?
最后命令的完成码或在shell程序内所执行的shell程序;
$n
(n>0)获取传递的第n个参数
参考