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

168 lines
6.0 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[@]} # 获取数组长度方式二
```
### 算术运算
算术运算符
| 算术运算符 | **含义** | 示例 |
| -------------------------- | -------- | ------------- |
| +、 - | 加减 | echo $((1+1)) |
| *、 /、 % | 乘除取余 | |
| ** | 幂 | |
| ++、 -- | 自增自减 | |
| !、 &&、 \|\| | 逻辑 | |
| <<=、 >、 >= | 比较 | |
| ==、 != = | 比较 | |
| <<、 >> | 移位 | |
| ~、 \|、 &、 ^ | 位运算 | echo $((0&1)) |
| =、 +=、 -=、 *=、 /=、 %= | 赋值运算 | |
运算命令
| 运算命令 | 说明 |
| ---------- | ------------------------------------ |
| (()) | 整数运算 |
| let | 数学运算 |
| $[] | 整数运算 |
| expr | 整数运算,或处理字符串 |
| bc | 整数、小数运算 |
| declare -i | 将变量定义为整数,仅支持加减乘除取余 |
### 函数
```bash
function help(){
echo "help"
}
```
# --------------------
#### 基本格式
* 第1行总是以`#!/bin/sh`开始通知shell使用何种解释器。
* 以`#`开头的行是注释,建议在第二行注释中写入脚本名。
* 脚本按从上到下的顺序执行。
#### 保留字和元字符
```
do, done, for, while
if, then, else
```
```shell
.. # 上级目录
. # 当前目录
* # 任意多个字符
? # 任意一个字符
~ # 用户目录
$ # 变量参数
# # 注释
| # 管道
& # 后台执行
&& # 左边的命令返回真后,右边的命令才能执行
|| # 左边的命令执行错误,则执行右边的命令
() # 在当前shell执行括号内的一组命令
{} # 在子shell执行括号内的一组命令
[...] # 匹配括号内的任意一个字符
[!...] # 不包含括号内的所有字符
> # 标准输出重定向
cmd 2> file # 把标准错误重定向到file
2>&1 # 把标准错误和标准输出都作为标准输出,然后重定向。其实现原理是把标准输出的文件描述符复制给标准错误。
>> # 标准输出追加
cmd 2>> file # 把标准错误追加到file
# cmd >> file 2>&1把标准输出和标准错误都追加到file里等同于cmd &>> file
< # 输入重定向
# cat < abc.txt 意思就是把abc.txt作为cat命令的输入
命令 << 分界符 # 从标准输入设备读入,直到分界符才停止
# cat << 0 意思是从键盘(标准输入)输入字符到cat命令直到0才停止
cmd < file1 > file2 # file1的内容作为cmd命令的输入cmd命令的输出放在file2里。
# shell可识别4种引字符号
' # 单引号。两个单引号之间的特殊字符均被识别为普通字符。
" # 双引号。两个单引号之间的特殊字符大部分被识别为普通字符,但不包含单引号、反斜杠、$
\ # 反斜杠。转义或在行尾表示续行。
` # 反引号。两个反引号之间的命令被替换为这个命令的输出。$()也有此作用。反引号不能嵌套,而$()可以嵌套。
```
#### shell变量
##### 整型变量
- 变量默认是字符串,要让它是整型需要这么写`var=$((3))`。
##### 本地变量
- 仅对当前进程有效
##### 环境变量
- 对所有进程有效
- export导出环境变量
- env显示环境变量
- unset清除环境变量
##### 特定变量
```
!! # 上条命令
!# # 上条命令的名称
!^ # 上条命令的第一个参数
!$ # 上条命令的最后一个参数
!:n # 上条命令的第n个参数
!:n-m # 上条命令从n到m条参数
!:n* # 上条命令从n开始到最后一条参数
!* # 上条命令的所有参数
$0 # 当前脚本的文件名
$num # 表示传递给脚本的第num个参数num从1开始
$# # 传递给脚本的参数个数
$* # 表示所有参数。即"$1" "$2" ... "$n"。"$*"表示"$1 $2 ... $n"。
$@ # 表示所有参数。不论是否使用引号,都表示"$1" "$2" ... "$n"。
$? # 上条命令的返回值成功为0不成功为非0
$$ # 当前shell的pid
$! # 后台运行的最后一个进程的pid
$- # shell使用的当前选项
$_ # 上条命令的最后一个参数
```
##### 在变量中切割字符串
```
# 假设var=http://www.abc.com/test.htm
${parameter:-word} # 如果parameter有值则取其值否则结果为word
${parameter:=word} # 如果parameter有值则取其值否则结果为word
${parameter:?word} # 如果parameter有值则取其值否则结果为word
${parameter:+word} # 无论parameter是否有值结果为总是word
${#parameter} # 获取字符串的长度,例如${#var}的结果为27
${parameter%word} # 最小限度从后面截取word
${parameter%%word} # 最大限度从后面截取word
${parameter#word} # 最小限度从前面截取word例如${var#*/}的结果为/www.abc.com/test.htm
${parameter##word} # 最大限度从前面截取word例如${var##*/}的结果为test.htm
${parameter:start} # 从start开始获取字符串如${var:7}的结果为www.abc.com/test.htm
${parameter:start:len} # 从start开始截取len个字符如${var:7:3}的结果为www
${parameter:start-len} # 先取最右的len个字符然后再从所得的字符串的start位开始截取如${var:3-5}和${var:2-4}的结果都是tm
${parameter:start-len1:len2} # 先取最右的len1个字符然后再从所得字符串的start位开始截取长度为len2的字符。如${var:3-5:1}的结果是t
```