Shell是一个用C语言编写的程序,既是一种命令语言,也是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供一个界面,用户通过这个界面访问操作系统内核的服务
Shell环境
Shell编程与PHP编程一样,只需要一个能编写代码 的文本编辑器和一个能解释执行的脚本解释器。
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)
- ……
本篇主要使用Bash说明。由于其易用和免费,在日常工作中广泛被使用。同时Bash也是大多数Linux系统默认的Shell
Shell脚本的开头通常有个#!
用来告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序
运行脚本的两种方式
1. 作为可执行程序
1 | chmod +x ./test.sh # 使脚本具有执行权限 |
注意,一定要写成./test.sh
,而不是test.sh,运行其它二进制程序也一样,直接写test.sh,linux系统回去PATH里寻找有没有叫test.sh,而只有/bin,/sbin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的
2. 作为解释器参数
1 | /bin/sh test.sh |
Shell变量
定义
name="lsj"
注意,变量名和等号之间不能有空格。变量命名须遵循如下规则
- 命名只能使用英文字母,数字和下划线
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
使用
使用一个定义过的变量,只要在变量前加美元符号即可
1 | echo $name |
变量名外的花括号可选
只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
1 | !/bin/bash |
删除变量
使用unset命令可以删除变量
1 | unset variable_name |
unset命令不能删除只读变量
变量类型
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
Shell字符串
字符串可以用单引号、双引号,也可以不用引号。单双引号的区别跟PHP类似
单引号
str='this is a string'
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
1 | name='lsj' |
输出:
1 | Hello, I know you are lsj! |
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
获取字符串长度
1 | string="abcd" |
提取子字符串
从字符串第二个字符开始截取5个字符
1 | str="lsj is a great man" |
Shell数组
bash只支持一维数组,从下标0开始,下标可以是整数或算数表达式
定义数组
1 | arr=(v1 v2 v3) |
可以单独定义数组的各个分量
1 | array_name[0]=value0 |
读取数组
${数组名[下标]}
使用@符号可以获取数组中的所有元素
获取数组的长度
1 | 取得数组元素的个数 |
Shell注释
以 #
开头的行就是注释,会被解释器忽略。
多行注释
1 | :<<EOF |
EOF 也可以使用其他符号:
1 | :<<' |
Shell传递脚本
执行Shell脚本时,可以向脚本传递参数,脚本内获取参数的格式为:$n
。n代表一个数字,1为执行脚本的第一个参数,2位第二个,以此类推
处理参数的特殊字符
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如”\$*”用「”」括起来的情况、以”\$1 \$2 … $n”的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与\$*相同,但是使用时加引号,并在引号中返回每个参数。 如”\$@”用「”」括起来的情况、以”\$1” “\$2” … “$n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
Shell 基本运算符
支持的运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但可以通过其他命令来实现,例如awk和expr,expr最常用
两数相加实例
1 | !/bin/bash |
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。