概述
Linux的shell有很多种类,常见的有以下几种:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
其中 Bourne Again Shell又叫做bash,是应用的最多同时也是Linux系统默认使用的shell。
注意:一般情况下并不区分Bourne Shell和Bourne Again Shell,也就是说像 #!/bin/sh,同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,也就是指定使用哪种shell来解释此脚本。
第一个shell脚本
新建一个脚本文件,如test.sh,其中后缀.sh只是为了见名知意,可以改成任何其他的名字,如之间省略只用test也可以。因为真正执行脚本的只跟它的第一行也就是#!xxx有关。
有两种运行shell脚本的方式,一种是直接在当前路径下执行./test,一种是在当前路径下指定解释器来执行,如/bin/sh test。其中第二种方式不需要在文件的第一行指定解释器信息,写了也没用。
shell变量
定义变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
name="xiaowang"
注意:变量名和等号之间不能有空格!
命名规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc`
或
for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可。为变量加上花括号能使程序更加易读和准确,是非常好的习惯。
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能更改。
可以发现,运行到第4行的时候,会提示说name是只读变量,因此这时候的赋值无效,最后输出的还是xiaowang。
删除变量
使用ubset命令可以删除变量,变量删除后不能再次使用,但unset不能删除只读变量。
变量类型
三种shell变量,一种是局部变量,一种是环境变量,还有一种是shell变量。
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
shell字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
双引号中可以引用变量,也可以使用转义字符。
拼接字符串
获取字符串长度
使用#符获取字符串长度
提取子字符串
字符串的第一个元素下标为0而不是1,因此提取第10个到第14个元素的语法可以理解成,从第10个元素也就是下标从9开始提取5个元素。
shell数组
bash支持一维数组(不支持多维数组),并且在初始化时不需要指定数组大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组
与读取变量类似,也可以使用$符,格式如下;
${数组名[下标]}
下标如果用*号或@符表示,则可以读取数组全部元素。
获取数组长度
与获取字符串长度的方式类似,也是借助#符
shell注释
使用#开头来注释一行内容
如果要临时注释多行,可以使用花括号将其括起来定义成函数,函数不被调用,则相当于注释掉了
除此之外,多行注释也可以使用如下格式:
参数传递
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……,注意,$0代表执行的文件的文件名。
运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
注意,完整的表达式要被 反引号``包含,并且,表达式和运算符之间要有空格,如2+2是不对的,应该写成2 + 2,不然会当成字符串而拼接。