每个shell脚本文件第一行都要指定使用哪个shell,我们默认使用`#!/bin/bash`
变量
变量类型
运行shell时,会同时存在三种变量:
- 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量声明
1 | v1=123 |
在上面的声明语法中我们需要注意以下几点
=左右不能用空格- 变量的默认类型是字符串
- 该变量对当前以及子shell都有效
命令结果赋值
将命令执行的结果作为值传送给一个变量可以使用
1 | dirName=`date +%Y_%m_%d_%H_%M_%S` |
1 | Group_port=18080 |
变量引用
我们通过使用$或者${}符号可以引用一个变量
1 | v=1 |
需要注意的是,
$()是用来做命令替换的(\`也是用来做命令替换的), 而${}是用来做变量替换的($var与${var}`并没有啥不一样)
只读变量
readonly 命令可以将变量定义为只读变量
1 | readonly myUrl |
删除变量
1 | unset myUrl |
特殊变量
$0: 当前脚本的文件名$n: 传递给脚本或函数的参数。(第一个参数是$1,第二个参数是$2)$#: 传递给脚本或函数的参数个数。$*: 传递给脚本或函数的所有参数。$@: 传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同$?: 上个命令的退出状态,或函数的返回值。$$: 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
数组
数组定义
一对括号表示是数组,数组元素用“空格”符号分割开。
1 | array=(1 2 3 4 5) |
数组长度
1 | {#数组名[@或*]} : 可以得到数组长度 |
索引数组成员
${数组名[下标]} : 下标是从0开始 (下标是:*或者@ 得到整个数组内容)
1 | {array[2]} |
数组成员赋值
数组名[下标]: 进行数组元素引用,如果下标不存在,自动添加新一个数组元素
1 | array[1]=100 |
删除数组
unset 数组[下标]:删除下标相应的元素,不带下标,则删掉整个数组。
1 | unset array[1] |
数组分片
${数组名[@或*]:起始位置:长度}: 切片数组,返回一个用“空格”分割元素的字符串
如果加上
(),将得到切片数组
1 | c=(${array[@]:1:4}) |
数组替换
${数组名[@或*]/查找字符/替换字符}: 该操作不会改变原先数组内容
1 | {array[@]/old/new} |
运算符
算术运算符
我们可以使用expr, let, (()), []等四种方式进行算术运算
+: 加法(($a + $b))-: 减法(($a - $b))*: 乘法(($a \* $b))/: 除法(($b / $a))%: 取余(($b % $a))=: 赋值a=$b==: 相等。用于比较两个数字,相同则返回 true。[ $a == $b ]返回 false。!=: 不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ]返回 true。
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ]返回 true。-ne检测两个数是否相等,不相等返回 true。[ $a -ne $b ]返回 true。-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ]返回 false。-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ]返回 true。-ge检测左边的数是否大等于右边的,如果是,则返回 true。[ $a -ge $b ]返回 false。-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ]返回 true。
逻辑运算符
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ]返回 true。-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ]返回 true。-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ]返回 false。
字符串运算符
=检测两个字符串是否相等,相等返回 true。[ $a = $b ]返回 false。!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ]返回 true。-z检测字符串长度是否为0,为0返回 true。[ -z $a] 返回 false。-n检测字符串长度是否为0,不为0返回 true。[ -z $a] 返回 true。str检测字符串是否为空,不为空返回 true。[ $a] 返回 true。
文件测试运算符
-b文件是否是块设备文件,如果是,则返回 true。[ -b $file] 返回 false。-c文件是否是字符设备文件,如果是,则返回 true。[ -b $file] 返回 false。-d文件是否是目录,如果是,则返回 true。[ -d $file] 返回 false。-f文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file] 返回 true。-g文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file] 返回 false。-k文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file] 返回 false。-p文件是否是具名管道,如果是,则返回 true。[ -p $file] 返回 false。-u文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file] 返回 false。-r文件是否可读,如果是,则返回 true。[ -r $file] 返回 true。-w文件是否可写,如果是,则返回 true。[ -w $file] 返回 true。-x文件是否可执行,如果是,则返回 true。[ -x $file] 返回 true。-s文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file] 返回 true。-e文件(包括目录)是否存在,如果是,则返回 true。[ -e $file] 返回 true。
流程控制
shell流程控制包含:
- if
- while
- until
- case
- for
同样的shell也支持break和continue
if
condition 可以使用 文件测试运算符 或者 关系运算符 进行条件判断
语法格式
1 | if condition |
示例
1 | !/bin/bash |
我们一定要注意if前后的空格
if else
1 | if condition |
if else-if else
1 | if condition1 |
case
case语句为多选择语句
1 | case 值 in |
示例
1 |
|
for
1 | for var in item1 item2 ... itemN |
示例
1 | !/bin/bash |
while
1 | while condition |
示例
1 | !/bin/bash |
until
until循环执行一系列命令直至条件为真时停止。
1 | until condition |
示例
1 | !/bin/bash |
函数
调用函数不需要加()
1 | vi=123546789 |
带参数的函数
参数名是固定的$n, 如果参数大于10的话就需要${10}
1 | f() { |
函数的返回值
函数返回值在调用该函数后通过 $? 来获得
1 | f() { |
如果不写return, 则直接返回0
1 | f() { |
在当前shell里执行一个文件里的命令:
1 | source /home/user/file.name |