Shell | 基础学习笔记
Contents
Shell Scripts 变量
- 定义 -
$ myname=zhe
- 使用 -
$ echo $myname
- 只读 -
$ readonly修饰变量
- 删除 -
$ unset myname
- 变量类型:
- 局部变量
- 环境变量
- Shell变量
Shell Scripts 字符串
' '
单引号$ str='this is a string'
- 单引号里内容原样输出,且不能获取变量值
- 单引号里不能出现
'
,对单引号进行转义也不行
" "
双引号$ str="this is a string"
- 双引号中可获取变量的值
- 双引号中允许转义
字符串处理
$ echo ${#str}
- 获取str长度$ echo ${str:1:4}
- 获取子字符串(索引1-4)
Shell Script数组
定义数组
- 数组表示:
()
, 数组元素用空格
隔开 $ array_test=(v1 v2 v3)
- 亦可定义数组各个分量:
$ array_test[0]=lalala
- 数组表示:
读取数组
- Usage:
${array_name[index]}
$ ${array_test[1]}
- 输出v2
- 获取所有元素:
@
$ ${array_test[@]}
- 获取数组长度:
$ ${#array_test[@]}
|$ ${#array_test[*]}
- Usage:
Shell Scripts 参数
脚本获取参数格式: $n
,n 为整数
$0
—获取脚本执行的文件名$1
—获取脚本执行的第一个参数$2
—获取脚本执行的第二个参数Options
$#
- 获取传递参数个数$*
- 以一个单字符串显示所有传入给脚本的参数$@
- 使用时加引号,且在引号中显示所有参数(“$1”,“$2”,“$3”)$*
&$@
的区别- 都是引用所有参数
- 在双引号中的显示结果不同
Shell Scripts 运算
算数运算符
原生bash不支持数学运算,通过使用 expr
表达式工具完成
注:
- 表达式和运算符之间有空格:`
val=expr 2 + 2
`- 完整的表达式要被
(反引号)
包含*
必须加 \ 才能实现运算
- a=10; b=20
+
,-
,*
,/
,%
,=
- `expr $a + $b` = 30
==
,!=
- 条件表达式必须用 []-方括号, 且要有空格
[ $a == $b ]
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串是数字; 结果为bool型
- a=10; b=20
eq 相等
[ $a -eq $b ]
, return false
nq 不相等
gt 大于
lt 小于
ge 大于等于
le 小于等于
逻辑运算符
&& 逻辑 And
|| 逻辑 Or
布尔运算符
-a 与
-o 或
! 非
字符串运算符
a=“www”; b=“google”
=
检测两个字符串是否相等,相等返回 true==
一般用两个等号来判断,其结果和一个等号的相同[ $a = $b ]
, return false[ $a == $b ]
, return false
!=
检测两个字符串是否相等,不相等返回 true-z
检测字符串长度是否为0,为0返回 true[ -z $a ]
, return false
-n
检测字符串长度是否为0,不为0返回 truestr
检测字符串是否为空,不为空返回 true[ $a ]
, return true
文件测试运算符
检测unix文件的各种属性
-b .块
-c .字符
-d .目录
-f .普通
-r .可读
-w .可写
-x .可执行
-s .文件为空
-e .文件或目录是否存在
-g, -k, -p, -u
Shell Scripts 条件
if ... then ... fi
单层
1 2 3 4
if [condition]; then command1 command2 fi
多重
1 2 3 4 5
if [condition]; then command1 else command2 fi
多重复杂
1 2 3 4 5 6 7
if [condition1]; then command1 elif [condition2]; then command2 else command3 fi
case ... in ... esac
语法格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
case $variable_1 in # 关键字case, 变量前有$ "variable_value") # 变量_1_值 command1 # 变量_1 的程序段 command2 ;; # 该类别结束 "variable_value") # 变量_2_值 command3 # 变量_2 的程序段 ;; # 该类别结束 *) # 用 * 代替其他所有值 command4 ;; esac
Shell Scripts 循环
for...do...done
语法格式
1 2 3 4 5
for var in item1 item2 ... itemn do command1 command2 done
while...do...done
当 condition 条件为真时,开始循环
1 2 3 4 5 6
while [condition] # 中括号为测试条件 do # 循环开始 command1 # 循环执行体 command2 ... done # 循环结束
until...do...done
当 condition 条件为真时,停止循环,
1 2 3 4 5 6
1. until [condition] 2. do 1. command1 2. command2 3. ... 3. done
说明:
- 测试发生在循环末尾,因此 until 循环体至少执行一次
dead loop
First
1 2 3 4 5
while : do command1 command2 done
Second
1 2 3 4
while true do command done
Third
1
for (( ; ; ))
jump loop
break
- 终止所有循环
continue
- 终止当前循环,进入下一次循环
Shell Scripts 函数
函数语法
1 2 3 4 5 6
function func_name () { command1 command2 ... return int # 返回可以不加,也可以显示的添加 }
说明:
- 函数必须在使用前定义,即放在脚本最开始; 使用函数名来调用函数
- 参数返回可以显示加
return int
(int取值 0-255 ) 返回; 如果不加将以最后一条命令运行结果作为返回值 - 函数返回值通过
$?
来获取
函数参数
函数参数和脚本参数获取方式一样:即在函数内部通过
$n
的形式获取参数值, $1-第一个参数, $2-第二个参数说明:
$0
—依旧获取脚本执行的文件名
Shell Scripts 文件包含
语法格式
- 格式一
. filename
- 点号 . 和文件名间有空格
- 格式二
source filename
Shell Scripts 追踪与调试
sh -[nvx] scripts.sh
n
- 不执行script,只检查语法错误v
- 在执行script前,先将script内容输出到屏幕上x
- 将使用到的script内容输出到屏幕上
Shell Scripts 常用用法
See Also
Thanks to the authors 🙂