更新 README.md

This commit is contained in:
2024-07-24 22:09:43 +08:00
parent 043382bbe0
commit eb93a932df

162
README.md
View File

@@ -29,7 +29,7 @@
- [7.3 提取子串](#73-提取子串)
- [7.4 子串截除](#74-子串截除)
- [7.5 子串替换](#75-子串替换)
- [7.5](#75)
- [7.6 子串高级用法(${} ## %%)](#76-子串高级用法)
- [8. 数组](#8-数组)
- [8.1 初始化方式](#81-初始化方式)
- [8.2 获取数组中的元素](#82-获取数组中的元素)
@@ -79,7 +79,11 @@
- [18. shell脚本静态检查 --- shellcheck](#18-shell脚本静态检查-----shellcheck)
- [安装方式](#安装方式)
- [使用方式](#使用方式)
- [19. 参考资源](#19-参考资源)
- [19. shell 表达式](#19-shell表达式)
- [19.1 文件表达式](#191-文件表达式)
- [19.2 变量表达式](#191-变量表达式)
- [19.3 条件表达式](#191-条件表达式)
- [20. 参考资源](#20-参考资源)
## 0. 使用环境和说明
- centos8
@@ -457,7 +461,72 @@ echo $(expr index "$str" H) # 结果为 6
![](./img/子串替换.png)
### 7.5
### 7.6 子串高级用法
假设定义了一个变量为:
```
file=/dir1/dir2/dir3/my.file.txt
```
命令|描述|结果
:-|:-|:-
${file#*/}|删掉第一个 / 及其左边的字符串|dir1/dir2/dir3/my.file.txt
${file##*/}|删掉最后一个 / 及其左边的字符串|my.file.txt
${file#*.}|删掉第一个 . 及其左边的字符串|file.txt
${file##*.}|删掉最后一个 . 及其左边的字符串|txt
${file%/*}|删掉最后一个 / 及其右边的字符串|/dir1/dir2/dir3
${file%%/*}|删掉第一个 / 及其右边的字符串|(空值)
${file%.*}|删掉最后一个 . 及其右边的字符串|/dir1/dir2/dir3/my.file
${file%%.*}|删掉第一个 . 及其右边的字符串|/dir1/dir2/dir3/my
**快速记忆法**
> #去掉左边,截取右边字符(键盘上# 在$ 的左边)
> %去掉右边,截取左边字符(键盘上% 在$ 的右边)
**从指定位置开始截取**
也可对变量值里的字符串作替换:
```
${file/dir/path}: 将第一个dir 替换为path: /path1/dir2/dir3/my.file.txt
${file//dir/path}: 将全部dir 替换为 path: /path1/path2/path3/my.file.txt
```
利用 ${} 针对不同的变数状态赋值(没设定、空值、非空值):
格式|说明
:-|:-
${file-my.file.txt}|若 $file 没有设定,则使用my.file.txt作传回值。(空值及非空值时不作处理)
${file:-my.file.txt}|若 $file 没有设定或为空值,则使用my.file.txt作传回值。(非空值时不作处理)
${file+my.file.txt}|若 $file 设为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)
${file:+my.file.txt}|若 $file 为非空值,则使用my.file.txt作传回值。(没设定及空值时不作处理)
${file=my.file.txt}|若 $file 没设定,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt 。(空值及非空值时不作处理)
${file:=my.file.txt}|若 $file 没设定或为空值,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt 。(非空值时不作处理)
${file?my.file.txt}|若 $file 没设定,则将my.file.txt输出出至STDERR。(空值及非空值时不作处理)
${file:?my.file.txt}|若 $file 没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)
**${#var} 可计算出变量值的长度**
```
file=/dir1/dir2/dir3/my.file.txt
${#file}
#可得到27, 因为 /dir1/dir2/dir3/my.file.txt 是27个字节
```
**总结**
格式|说明
:-|:-
${string##*chars}|从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string#*chars}|从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%%*chars}|从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%*chars}|从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string: 0-start :length}|从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start}|从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string: start :length}|从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start}|从 string 字符串的左边第 start 个字符开始截取,直到最后。
## 8. 数组
bash支持**只支持一维数组**。数组元素可使用符号 `var[number]` 来初始化。
@@ -1176,7 +1245,92 @@ shellcheck testop.sh
![](./img/shellcheck例子.png)
## 19. 参考资源
## 19. shell表达式
### 19.1 文件表达式
选项|说明
:-|:-
[ -a FILE ]|如果 FILE 存在则为真。
[ -b FILE ]|如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ]|如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ]|如果 FILE 存在且是一个目录则为真。
[ -e FILE ]|如果 FILE 存在则为真。
[ -f FILE ]|如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ]|如果 FILE 存在且已经设置了SGID则为真。
[ -G FILE ]|如果 FILE 存在且属有效用户组则为真。
[ -h FILE ]|如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ]|如果 FILE 存在且已经设置了粘制位则为真。
[ -L FILE ]|如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ]|如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -n STRING ]or [ STRING ]|"STRING" 的长度为非零 non-zero则为真。
[ -O FILE ]|如果 FILE 存在且属有效用户ID则为真。
[ -o OPTIONNAME ]|如果 shell选项 “OPTIONNAME” 开启则为真。
[ -p FILE ]|如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ]|如果 FILE 存在且是可读的则为真。
[ -s FILE ]|如果 FILE 存在且大小不为0则为真。
[ -S FILE ]|如果 FILE 存在且是一个套接字则为真。
[ -t FD ]|如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ]|如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ]|如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ]|如果 FILE 存在且是可执行的则为真。
[ -z STRING ]|"STRING" 的长度为零则为真。
[ -z "echo 111s\|sed 's/\[0-9]//g'" ] && echo 1 \|\| echo 0|把字符串中的数字都替换掉
[ FILE1 -ef FILE2 ]|如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ FILE1 -nt FILE2 ]|如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ]|如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ STRING1 != STRING2 ]|如果字符串不相等则为真。
[ STRING1 < STRING2 ]|如果 “STRING1” sorts before "STRING2" lexicographically in the current locale则为真。
[ STRING1 == STRING2 ]|如果2个字符串相同。 "=" may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 > STRING2 ]|如果 “STRING1” sorts after "STRING2" lexicographically in the current locale则为真。
### 19.2 变量表达式
**整数变量表达式**
>-eq 等于
>-ne 不等于
>-gt 大于
>-ge 大于等于
>-lt 小于
>-le 小于等于
**字符串变量表达式**
>if [ $a = $b ] 如果string1等于string2,则为真字符串允许使用赋值号做等号
>if [ $string1 != $string2 ] 如果string1不等于string2,则为真
>if [ -n $string ] 如果string 非空(非0),返回0(true)
>if [ -z $string ] 如果string 为空,则为真
>if [ $sting ] 如果string 非空,返回0 (和-n类似)
### 19.3 条件表达式
**逻辑非 !**
```
if [ ! 表达式 ]
if [ ! -d $num ] 如果不存在目录$num
```
**逻辑与 -a**
```
if [ 表达式1 -a 表达式2 ]
```
**逻辑或 -o**
```
if [ 表达式1 -o 表达式2 ]
```
## 20. 参考资源
- 《高级bash脚本编程指南》
- https://juejin.cn/post/6844904045329514504
- https://juejin.cn/post/6962032698697187364