Shell脚本

shell是一种脚本语言,shell脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(不需要编译)
编写shell脚本步骤:需求分析、命令测试、脚本编写、测试优化

脚本执行方式

1
2
3
bash shell.sh
source shell.sh
./shell.sh

变量命名规则

  • 区分大小写
  • 不能使用程序内的保留字和内置变量
  • 只能使用数字、字母及下划线、且不能以数字开头
  • 使用英文尽量使词义通俗易懂
    变量定义:count=3(注意等号前后不能加空格)
    变量释放:unset count

用户自定义变量—取值

  • 双引号(弱引用):允许通过$符号引用其他变量值,变量引用被替换为变量值
  • 单引号(强引用):禁止引用其他变量值,$视为普通字符,保留源字符串
  • 反撇号:命令替换,提取命令执行后的输出结果

数组的使用

在shell脚本中,数组的定义和删除有以下形式:

1
2
3
4
5
6
7
8
# 数组定义
a="1 3 5 7 9"
a=(1 3 5 7 9)
a=([0]=1 [1]=3 [2]=7)
# 删除数组a中的第n个元素
unset a[n]
# 删除数组a
unset a

在定义好数组元素后,可使用以下符号对数组进行引用

符号说明
$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
2
# 当有多个变量时,会从输入的一行词中,按顺序赋值到变量中,若输入词多于变量数,其余值将全部赋值给最后的变量
read val1 val2 val3

在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
2
3
4
5
6
7
8
9
10
function func_name()
{
函数体
[return val]
}
# 方式一:
ret_val=`func_name [参数1 参数2 ...]`
# 方式二:
func_name [参数1 参数2 ...]
echo $?

变量作用域

局部变量的声明格式:

1
Local value_name=value

全局作用域:脚本任何地方都能访问
局部作用域:只能在声明变量的作用域内访问