Shell脚本编程
Shell脚本
shell是一种脚本语言,shell脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(不需要编译)
编写shell脚本步骤:需求分析、命令测试、脚本编写、测试优化
脚本执行方式
1 | bash shell.sh |
变量命名规则
- 区分大小写
- 不能使用程序内的保留字和内置变量
- 只能使用数字、字母及下划线、且不能以数字开头
- 使用英文尽量使词义通俗易懂
变量定义:count=3(注意等号前后不能加空格)
变量释放:unset count
用户自定义变量—取值
- 双引号(弱引用):允许通过$符号引用其他变量值,变量引用被替换为变量值
- 单引号(强引用):禁止引用其他变量值,$视为普通字符,保留源字符串
- 反撇号:命令替换,提取命令执行后的输出结果
数组的使用
在shell脚本中,数组的定义和删除有以下形式:
1 | # 数组定义 |
在定义好数组元素后,可使用以下符号对数组进行引用
符号 | 说明 |
$a 和 ${a[0]} | 数组a的第一个元素 |
${a[-1]} | 数组a的最后一个元素 |
${a[*]} 和 ${a[@]} | 数组中的所有元素 |
${#a[@]} | 数组中的元素个数 |
${a[@]:start:count} | 以起始元素start为首,指定count个数的元素(起始元素id不能为负值) |
环境变量
变量名 | 说明 |
---|---|
$USER | 用户名称 |
$HOME | 用户的宿主目录 |
$LANG | 语言和字符集 |
$PWD | 当前所在工作目录 |
$PATH | 可执行用户程序的默认路径 |
export | 可将变量指定为全局变量 |
只读变量
定义语法:readonly 变量名=变量值
该变量值不允许修改,而且无法使用unset进行删除,要清除该变量最快方法是重启
位置变量和预定义变量
符号 | 说明 |
---|---|
$0 | 与键入的命令行一样,包含脚本文件 |
$1,$2,…$9 ${10} | 分别包含第一个到第十个命令行参数 |
$# | 包含命令行参数个数 |
$@ | 包含所有命令行参数 |
$* | 包含所有命令行参数 |
$? | 包含前一个命令的退出状态 |
$$ | 包含正在执行进程的ID号 |
功能性语句
read命令
语法:read [option] value
功能:使用该命令将从标准输入读取一行数据,并赋值到后面value变量中
1 | # 当有多个变量时,会从输入的一行词中,按顺序赋值到变量中,若输入词多于变量数,其余值将全部赋值给最后的变量 |
在read命令中可带以下参数:
-p:指定输入的提示信息
-t:指定输入的时间
-s:输入不显示
expr命令
语法:expr 数值运算
功能:主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、除(/)和取模(%)
使用该命令时,若需将运算的值赋值给变量,则需要使用反撇号,如:
1 | sum=`expr 12 \* 3 + 2` |
test命令
语法:test 测试表达式 或 [ 测试表达式 ]
功能:该命令用于检查某个条件是否成立,其可进行整数、字符、文件三个方面进行判断
整数测试
参数 | 说明(a 参数 b) |
---|---|
-eq | a等于b时为真 |
-ne | a不等于b时为真 |
-gt | a大于b时为真 |
-ge | a大于等于b时为真 |
-lt | a小于b时为真 |
-le | a小于等于b时为真 |
字符串测试
参数 | 说明 |
---|---|
= | 判断两个字符串内容是否一样 |
!= | 判断两个字符串内容是否不一样 |
-z | 判断两个字符串长度是否为0 |
-n | 判断两个字符串长度是否不为0 |
文件参数
参数 | 说明(参数 文件名) |
---|---|
-e | 文件是否存在 |
-d | 是否为目录 |
-f | 是否为普通文件 |
-L | 是否为符号链接 |
-r | 文件是否存在,且可读 |
-w | 文件是否存在,且可写 |
-x | 文件是否存在,且可执行 |
-s | 文件是否存在,且其长度不为0 |
-nt | file1 -nt file2,判断file1是否比file2新 |
-ot | file1 -ot file2,判断file1是否比file2旧 |
函数
基本语法及调用格式
1 | function func_name() |
变量作用域
局部变量的声明格式:
1 | Local value_name=value |
全局作用域:脚本任何地方都能访问
局部作用域:只能在声明变量的作用域内访问
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 嵌梦津途学思录!