目录
Shell脚本是什么?
Shell命令按一定语法组成的文件
Shell脚本有什么用?
- 与批处理文件类似,可以解决日常生活中的一些重复性工作;
- Shell命令不多,但可以通过整合命令实现丰富的功能。
Shell命令的本质
- 内置命令:在启动Shell时就已经将命令加载到内存(cd/pwd/ls等等),速度比较快。
- 外部命令:一个应用程序。在启动Shell后,会自动加载环境变量PATH,当输入外部命令时,系统会自动到环境变量中对应命令的路径中找该命令,如果没找到就会报错。找到了就创建一个新进程来执行这个命令(系统先在内置命令里面找,找不到再去找外部命令)
(环境变量中的路径以 : 隔开)
type可以查询shell命令的本质
创建一个外部命令
-
步骤一:创建hello
-
步骤二:将hello放入PATH中的其中一条路径
(hello便变成外置命令)
Shell脚本语言和C语言一样吗?
- 不一样
- C语言是编译型语言,需要借助编译器将源文件转化为可执行文件。
- Shell语言是解析型语言,需要借助解析器(sh、bash、rbash、dash等等)去运行
编写shell脚本
- 步骤一:创建sh文件
(shell脚本的惯用后缀名为sh) - 步骤二:编写文件内容
- 更改运行权限,并运行
Shell启动方式
- 当程序运行
- 指定解析器运行
- source 和 .
Shell脚本语法
1、定义变量
- variable=value (适用变量值没有空格符)
- variable=‘value’ (单引号)
- variable=“value”
第二种和第三种的区别在于输出时对变量的引用
- 第三种
- 第二种
2、使用变量
- $variable
- ${variable}
3、将命令结果赋值给变量
- variable=
command
(反引号) - variable=$(command)
4、删除变量
- unset
(var不存在)
5、特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n (n >= 1) | 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2 |
$# | 传递给脚本或函数的参数个数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数。当被双引号""包含时,$@ 与 $* 稍有不同 |
$? | 上个命令的退出状态或者获取函数返回值 |
$$ | 当前Shell进程ID。对于Shell脚本,就是这些脚本所在进程ID |
-
$n
-
#? (一般搭配 exit*)
- 退出10
- 退出
- 退出10
-
$$
6、字符串拼接
并排放
7、读取从键盘输入的数据
read
8、退出当前进程
exit
9、对整数进行数学运算
(())
10、逻辑与/或
- command1 && command2
只有当 command1 成立后,才能执行 command2
- command1 || command2
当 command1 为真时,不会执行 command2;
当 command1 为假时,才会执行 command2。
11、检测某个条件是否成立
test expression 和 [ expression ]
注意: [] 中内部的最前面和最后面都需要空格
选项 | 作用 |
---|---|
-eq | 判断数值是否相等 |
-ne | 判断数值是否不相等 |
-gt | 判断数值是否大于 |
-lt | 判断数值是否小于 |
-ge | 判断数值是否大于等于 |
-le | 判断数值是否小于等于 |
-z str | 判断字符串 str 是否为空 |
-n str | 判断字符串 str 是否为非空 |
= 和 == | 判断字符串 str 是否相等 |
-d filename | 判断文件是否存在,并且是否为目录文件 |
-f filename | 判断文件是否存在,并且是否为普通文件 |
- -z str
- -d filename
- -f filename
12、管道
command1 | command2
管道用于连接多个命令,前一个命令的输出结果作为下一个命令的输入内容之一,前提时前一个命令必须是有效的,否则无法输入到下一个命令
13、if 语句
if condition
then
statement(s)
fi
14、if else 语句
if condition
then
statement1
else
statement2
fi
15、if elif else 语句
if condition1
then
statement1
elif condition2
then
statement2
.......
else
statementm
16、case in 语句 (类似C中的 switch)
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
........
*)
statementn
esac
17、for in 语句
for variable in value_list
do
statements
done
value_list
- 直接给出具体的值
- 给出一个取值范围
- 使用命令的执行结果、Shell 通配符
- 试用特殊变量
(加了双引号后,$* 按参数输入的格式打印出输入的参数)
18、while循环
while condition
do
statemnets
done
19、函数
function name(){
statements
[return value]
}