变量不需要声明,初始化不需要指定类型
变量命名
1、只能使用数字,字母和下划线,且不能以数字开头
2、变量名区分大小写
注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格
显示变量值使用echo命令(类似于java中的system.out) ,加上$变量名,也可以使用${变量名}
变量分类:
Shell变量有这几类:本地变量、环境变量、局部变量、位置变量、特殊变量。
本地变量:
- 只对当前shell进程有效的,对当前进程的子进程和其它shell进程无效。
- 定义:VAR_NAME=VALUE
- 变量引用:${VAR_NAME} 或者 $VAR_NAME
- 取消变量:unset VAR_NAME
- 相当于java中的私有变量(private),只能当前类使用,子类和其他类都无法使用
局部变量:
- 在函数中调用,函数执行结束,变量就会消失
- 对shell脚本中某代码片段有效
- 定义:local VAR_NAME=VALUE
- 相当于java代码中某一个方法中定义的局部变量,只对这个方法有效。
位置变量:
比如脚本中的参数:
$0:脚本自身
$1:脚本的第一个参数
$2:脚本的第二个参数
Shell编程中有三类引号:单引号、双引号、反引号。
''单引号不解析变量
""双引号会解析变量
``反引号是执行并引用一个命令的执行结果,类似于$(...)
循环
for循环
通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环
格式1
格式2
格式3
注意:for i in {0..9} 等于for i in {0..9..1} , 第三个参数为跨步。
例如:
{0..9..2} 表示 0,2,4,6,8
while循环
适用于循环次数未知,或不便用for直接生成较大的列表时
格式:
循环控制命令——break
break命令是在处理过程中跳出循环的一种简单方法,可以使用break命令退出任何类型的循环,包括while循环和for循环
循环控制命令——continue
continue命令是一种提前停止循环内命令,而不完全终止循环的方法,这就需要在循环内设置shell不执行命令的条件
条件
bash条件测试
-gt:大于:
-lt:小于
-ge:大于等于
-le:小于等于
-eq:等于
-ne:不等于
if判断:
单分支
双分支
多分支
Case判断
有多个测试条件时,case语句会使得语法结构更清晰
格式:
需要用到shell中的逻辑操作符
-a 与
-o 或
! 非
自定义函数
格式:
- 引用自定义函数文件时,使用source func.sh
- 有利于代码的重用性
- 函数传递参数(可以使用类似于Java中的args,args[1]代表Shell中的$1)
- 函数的返回值,只能是数字
read
read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
格式
read如果后面不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中
declare
用来限定变量的属性
-r 只读
-i 整数:某些算术计算允许在被声明为整数的变量中完成,而不需要特别使用expr或let来完成。
-a 数组
字符串操作
获取长度:
字符串截取
取尾部的指定个数的字符
大小写转换
小-->大:
大-->小:
数组
定义:declare -a:表示定义普通数组
特点
- 支持稀疏格式
- 仅支持一维数组
数组赋值方式
- 一次对一个元素赋值a[0]=$RANDOM
- 一次对多个元素赋值a=(a b c d)
按索引进行赋值a=([0]=a [3]=b [1]=c)
使用read命令read -a ARRAY_NAME查看元素
获取数组的长度
获取数组内元素的长度
注意:${#ARRAY[0]}表示获取数组中的第一个元素的长度,等于${#ARRAY}
从数组中获取某一片段之内的元素(操作类似于字符串操作)
格式:
- offset:偏移的元素个数
- length:取出的元素的个数
- ${ARRAY[@]:offset:length}:取出偏移量后的指定个数的元素
- ${ARRAY[@]:offset}:取出数组中偏移量后的所有元素
数组删除元素:
其他命令
date
显示当前时间
- 格式化输出 +%Y-%m-%d
- 格式%s表示自1970-01-01 00:00:00以来的秒数
- 指定时间输出 --date='2009-01-01 11:11:11'
- 指定时间输出 --date='3 days ago' (3天之前,3天之后可以用-3)