computer_knowledge_notes/Languages/LinuxShell/0shell-programming.md

178 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 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
```