一、构建基础脚本
1、shell脚本中的第一行需要指定要使用的shell #!/bin/bash 它是bash shell,也可以用其他shell
2、用echo显示消息 相当于java的system.out.println
3、使用变量
1)环境变量 用set可以输出得到系统中的环境变量
shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称,登录到系统上的用户的名称,用户的系统ID等。
$variable ${variable} 如果不是用来表示变量就是$符号,可以用反斜扛\来转义
2)用户变量
变量规则:变量是不超过20个字母、数字或下划线的文本字符串;用户变量区分大小写;变量、等号和值之间不能出现空格。
shell脚本自动决定变量值的数据类型。在脚本的整个生命周期里,shell脚本中定义的变量会一直保持它们的值,但在shell脚本完成时删除掉。
变量赋值 value1=10 value2=$value1 把value1的值赋给value2,这时value2的值也为10
4、使用反引号“ 反引号允许将shell命令的输出赋给变量
比如利用date格式化输出作为后缀来创建日志,从而每天都有一个唯一的文件名的日志,通过日期后缀来判断
\#!/bin/bash
today=`date +%y%m%d `
ls /usr/bin -al > log.$today
5、重定向输入和输出
Command > outputfile 将命令输出保存到指定的输出文件中
date>test1
who>test1 会覆盖原来的结果
who >> test1 在原来结果基础上添加输出
command <inputfile
例如wc<test1
内联输入重定向 <<必须指定一个文本标记来划分要输入数据的开始和结尾,可以用任何字符串的值作为本文标记,但在数据的开始和结果必须一致。
shell会用PS2环境变量中定义的次提示符来提示输入数据。
6、管道
rpm -qa | sort
linux系统会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令,传输数据不会用到任何中间文件或者缓冲区域。
管道最流行的用法之一是将命令产生的长输出结果通过管道传送给more命令。
7、执行数学运算
用方括号[]把表达式包起来
Bash shell数学运算符只支持整数运算,如果要进行实际的数学计算,会是一个限制。
8、退出脚本
shell中运行的每个命令都使用退出状态码exit status来告诉shell它完成了处理,退出状态码是一个0~255之间的整数,在命令结束运行时由命令传给shell,你可以捕获这个值并在脚本中使用。
echo $? 看退出状态码
默认情况下,shell脚本会以脚本中最后一个命令的退出状态码退出。 Exit
退出状态码如果大于255,会将指定的数除以256取余。
二、使用结构化命令
有一类命令会基于变量值或其他命令的结果等条件使脚本跳过或循环执行命令。这样的命令通常能够被称为结构化命令。
2.1 if语句
如果if后面接的是命令,则命令正常工作时走then部分的语句,否则不走,它是通过退出状态码来识别的。
Else if可以写成elif
If then elif 嵌套组合语句
if command1
then
command set1
elif command2
then
command set 2
elif command3
command set 3
fi
2.2 test命令
test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回状态码为0,这样if-then语句就与其他变成语言中的if-then语句以类似的方式工作了。如果条件不成立,test命令就会退出并返回退出状态码1,这样if-then语句就会失效。
#test命令的格式
test condition
condition是test命令要测试的一系列参数和值。
在if-then语句中,test命令看起来是这样的:
if test condition
then
commands
fi
bash shell提供了另一种在if-then语句中声明test命令的方法:
if [condition]
then
commands
fi
test命令可以判断3类条件:
1. 数值比较
2. 字符串比较
3. 文件比较
1)数值比较
-eq #等于
-ge #大于或等于
-gt #大于
-le #小于或等于
-lt #小于
-ne #不等于
val1=10
if [ $val1 -gt 5 ]
then
echo "the val1 is greater than 5"
fi
注意:必须在左括号右侧和右括号左侧各加一个空格
2)字符串比较
= #字符串相同
!= #字符串不同
< #str1比str2小
`>` #大
-n #长度是否非0
-z #长度是否为0,长度为0也就是为空
比较字符串相等性时,test的比较会将所有的标点和大写也考虑在内。
if [ $val1 > $val2 ]
注意:1、大于小于符号必须转义,否则shell会把它们当作重定向符号把字符串值当作文件名
2、大于小于顺序和sort命令所采用的不同。在test命令中大写字母会被当成小于小写字母的。但当你将同样的字符串放进文件中并用sort命令排序时,小写字母会先出现。这是由各个命令使用的排序技术不同造成的。test命令会使用标准的ASCII顺序,根据每个字符的ASCII数值来决定排序顺序。sort命令使用的是系统的本地化语言设置中定义的排序顺序。对于英语,本地化设置指定了在排序顺序中小写字母出现在大写字母前。
3、test命令使用标准的数学比较符号来表示字符串比较,而用文本代码来表示数值比较,和别的语言不同,需要注意。
4、空的和未初始化的变量对shell脚本测试来说可能有灾难性的影响。如果你不是很确定一个变量的内容,最好在数值或字符串比较中使用它之前先通过-n或-z来测试一下变量是否含有值。
3)文件比较
-d file #检查file是否存在并是一个目录
-e #是否存在
-f #是否存在并是一个文件
-r #可读
-w #可写
-s #非空
-x #可执行
-O #存在并属当前用户所有
-G #默认组与当前用户相同
file1 -nt file2 #file1是否比file2新
-ot #旧
2.3 复合条件测试
[condition1] &&[condition2]
[condition1] || [condition2]
2.4 If-then 高级特性
1)用于数学表达式的双圆括号
if (($val ** 2 > 90))
双圆括号中的大于小于号不用转义
还支持其他运算符:
val++
val--
++val
--val
! 逻辑求反
- 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
2)用于高级字符串处理的双方括号
双方括号里的表达式除了使用test命令中采用的标准字符串比较,还提供了**模式匹配**pattern matching
If [[ $USER == r* ]] #判断环境变量USER是否以字母r开头
模式匹配中,可以定义一个正则表达式来匹配字符串值。
2.5 case命令
case variable in
pattern1|pattern2) command1;;
pattern3) command2;;
*) default commands;;
esac