更新 README.md
This commit is contained in:
162
README.md
162
README.md
@@ -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
|
||||
|
||||

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

|
||||
|
||||
## 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
|
||||
|
||||
Reference in New Issue
Block a user