178 lines
3.6 KiB
Markdown
178 lines
3.6 KiB
Markdown
### shell变量
|
||
|
||
- 数组
|
||
|
||
```
|
||
# shell只支持一维数组
|
||
array_name = (val0 ... valn) # 数组的定义方式一
|
||
array_name[0] = val0 # 数组的定义方式二
|
||
${array_name[index]} # 读取数组的元素
|
||
${array_name[*]} # 读取数组中的所有元素方式一
|
||
${array_name[@]} # 读取数组中的所有元素方式二
|
||
${#array_name[*]} # 获取数组长度方式一
|
||
${#array_name[@]} # 获取数组长度方式二
|
||
```
|
||
|
||
|
||
|
||
# --------------------
|
||
|
||
#### 基本格式
|
||
|
||
* 第1行总是以`#!/bin/sh`开始,通知shell使用何种解释器。
|
||
* 以`#`开头的行是注释,建议在第二行注释中写入脚本名。
|
||
* 脚本按从上到下的顺序执行。
|
||
|
||
#### 保留字和元字符
|
||
|
||
```
|
||
do, done, for, while
|
||
if, then, else
|
||
```
|
||
|
||
```
|
||
.. # 上级目录
|
||
. # 当前目录
|
||
* # 任意多个字符
|
||
? # 任意一个字符
|
||
~ # 用户目录
|
||
$ # 变量参数
|
||
# # 注释
|
||
| # 管道
|
||
& # 后台执行
|
||
&& # 左边的命令返回真后,右边的命令才能执行
|
||
|| # 左边的命令执行错误,则执行右边的命令
|
||
() # 在当前shell执行括号内的一组命令
|
||
{} # 在子shell执行括号内的一组命令
|
||
[...] # 匹配括号内的任意一个字符
|
||
[!...] # 不包含括号内的所有字符
|
||
> # 输出重定向
|
||
< #
|
||
>> # 追加
|
||
```
|
||
|
||
|
||
|
||
#### 条件控制
|
||
|
||
1. if-then-else
|
||
```
|
||
if 条件1
|
||
then 命令1 //如果条件1为真,则执行命令1
|
||
elif 条件2
|
||
then 命令2 //如果条件1为假且条件2为真,则执行命令2
|
||
else 命令3 //如果条件1为假且条件2为假,则执行命令3
|
||
fi //fi意为if语句终止
|
||
```
|
||
其中,elif和else为可选项。
|
||
2. case
|
||
```
|
||
case 值 in
|
||
模式1) 命令1
|
||
;;
|
||
模式2) 命令2
|
||
;;
|
||
|
||
...
|
||
|
||
*) 命令n
|
||
;;
|
||
esac
|
||
```
|
||
将值和每一个模式匹配,若匹配则执行相应命令不再与其它模式匹配,否则执行星号后的命令。
|
||
|
||
#### 循环
|
||
1. for
|
||
```
|
||
# 格式一
|
||
for 变量名 in 列表
|
||
do
|
||
命令1
|
||
命令2
|
||
...
|
||
done
|
||
|
||
# 格式二
|
||
for ((i=0; i<10; i++))
|
||
{
|
||
命令1
|
||
...
|
||
}
|
||
```
|
||
2. until
|
||
```
|
||
until 条件
|
||
do
|
||
命令1
|
||
...
|
||
done
|
||
```
|
||
当条件为真时循环结束,注意测试发生在**循环末尾**。
|
||
3. while
|
||
```
|
||
while 条件
|
||
do
|
||
命令1
|
||
...
|
||
done
|
||
```
|
||
4. break
|
||
|
||
跳出循环或case语句
|
||
5. continue
|
||
|
||
跳过当前循环
|
||
|
||
#### shell变量
|
||
|
||
##### 本地变量
|
||
|
||
- 仅对当前进程有效
|
||
|
||
##### 环境变量
|
||
|
||
- 对所有进程有效
|
||
|
||
- export导出环境变量
|
||
- env显示环境变量
|
||
- unset清除环境变量
|
||
|
||
##### 特定变量
|
||
|
||
```
|
||
!! # 上条命令
|
||
!# # 上条命令的名称
|
||
!^ # 上条命令的第一个参数
|
||
!$ # 上条命令的最后一个参数
|
||
!:n # 上条命令的第n个参数
|
||
!:n-m # 上条命令从n到m条参数
|
||
!:n* # 上条命令从n开始到最后一条参数
|
||
!* # 上条命令的所有参数
|
||
|
||
$0 # 当前脚本的文件名
|
||
$num # 表示传递给脚本的第num个参数,num从1开始
|
||
$# # 传递给脚本的参数个数
|
||
$* # 所有的位置参数
|
||
$@ # 所有的位置参数
|
||
$? # 上条命令的返回值,成功为0,不成功为非0
|
||
$$ # 当前shell的pid
|
||
$! # 后台运行的最后一个进程的pid
|
||
$- # shell使用的当前选项
|
||
$_ # 上条命令的最后一个参数
|
||
```
|
||
|
||
##### 在变量中切割字符串
|
||
|
||
```
|
||
${parameter:-word}
|
||
${parameter:=word}
|
||
${parameter:?word}
|
||
${parameter:+word}
|
||
${#parameter} # 获取字符串的长度
|
||
${parameter%word} # 最小限度从后面截取word
|
||
${parameter%%word} # 最大限度从后面截取word
|
||
${parameter#word} # 最小限度从前面截取word
|
||
${parameter##word} # 最大限度从前面截取word
|
||
```
|
||
|