Shell 编程
基础
主要从三个方面介绍:
- 概念
- 发展
- 构成
概念
终端和tty可以理解为一个东西,早期计算机一般是有一个物理终端,它作为一个硬件设备,人们对着终端敲键盘,终端显示输出。tty可以有多个,在linux中是输入/输出环境。
发展
1971,贝尔实验室为Unix开发出第一个shell,v6 shell。后来又有了 Bourne Shell, 即sh。
现在常用的 shell 有 bash, zsh, fish, dash等,它们都是从 sh 发展而来。
构成
Shell 既是一个解释器,解释来自终端的命令,也是一门编程语言。
语法和命令
变量
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串,浮点,整型,日期 |
| 环境变量 | 当前以及字shell | export | |
| 系统环境变量 | 所有shell | 启动加载 |
自定义变量左右不能有空格,值默认是字符串,所以不能运算。
可以用declare [+/-] 选项 变量的方式声明为想要的类型。如declare -i x声明为整型
| 变量名 | 含义 | 常见操作 |
|---|---|---|
$0 | 当前shell名称/脚本名称 | $1 $2等可以获取到传入参数 |
$# | 出入脚本的参数数量 | if [ $# -gt 1 ] |
$* | 传入脚本的所有参数 | |
$? | 上条命令执行的状态码 | if [ $? -eq 0 ] |
PS1 | 命令提示符 | |
$HOME | 用户目录 | |
$PATH | 路径 |
配置文件加载流程
运算符和引用
| 类型 | 符号 | 作用 | ||
|---|---|---|---|---|
| 算术 | + - * / % | & | ||
| 逻辑和比较 | && ! < > == != | |||
| 引号 | 单引号,双引号,反引号 | 依次是完全引用,部分引用和执行命令 | ||
| 圆括号 | (())、() | 依次是算术运算和执行命令 | ||
| 命令连接 | && ; | |||
| 后台运行 | & |
判断命令
提供了三种:
test[][[]]
注意中括号前后要有空格,中括号中的变量最好用引号括起来
test和[是命令,只能使用自己支持的标志位,如-f, -z, -e等
[[更丰富,在整型中支持> < =,在字符串比较支持正则
分支
if condition; then
\ ....
elif condition; then
\ ...
else
\ ...
fi
case形式
case $变量 in:
"第一个变量内容")
程序段
;;
"第二个变量内容")
程序段
;;
*)
程序段
;;
esac
循环
while condition; do 程序段; done
until condition; do 程序段; done
for var in [words...]; do 程序段; done
函数
# 第一种
funcName() { echo "abc"; }
# 第二种
function funcName() { echo "abc"; }
函数参数的获取, $0代表函数名,$1 $2获取后续参数
函数结果的获取一般使用打印,如echo, printf。而return一般返回状态码,存储在$?中
执行
可以直接用文件名运行,也可以bash运行,还可以source运行
执行过程
展开的方式有:
-
大括号
{...}a{b,c,d}e展开为abe, ace, ade{1..5}=> 1 2 3 4 5
-
波浪号
~- 当前主目录
-
参数
-
命令替换
-
数学计算
$(() -
文件名
* ? [..]