```shell
比较版本号:
printf '%s\n%s\n' "v1.24.0" "v1.24.1" | sort -V -C && echo "b大于等于a" || echo "b小于等于a"
```
```
忽略错误
||:
例如 `cmds ||:`
```
```
${}取值
假设我们定义了一个变量为:
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:0:5}:提取最左边的5 个字节:/dir1
${file:5:5}:提取第5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${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} 可得到27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节
```
##### grep:
```shell
grep [选项] "搜索内容" 文件名
选项:
-A 数字:列出符合条件的行,并列出后续的 n 行;
-B 数字:列出符合条件的行,并列出前面的 n 行;
-c:统计找到的符合条件的字符串的次数;
-i:忽略大小写;
-n:输出行号;
-v:反向査找;
grep -niro 'image' Cluster*
```
##### sed:
```shell
https://www.fity.cn/post/338.html
删除:d命令
#sed '2d' example-----删除example文件的第二行。
#sed '2,$d' example-----删除example文件的第二行到末尾所有行。
#sed '$d' example-----删除example文件的最后一行。
#sed '/test/'d example-----删除example文件所有包含test的行。
#sed d filename-----sed删除文件filename中的所有行
#sed 2,5d filename-----sed删除文件filename中的2至5行
#sed /abc/d filename-----sed删除文件filename中包含字符串abc的所有行
替换:s命令
#sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
#sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
#sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
#sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
#sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
```
##### seq
```shell
seq [选项]... 尾数 seq 5 输出: 1 2 3 4 5
seq [选项]... 首数 尾数 seq 1 5 输出: 1 2 3 4 5
seq [选项]... 首数 增量 尾数 seq 1 3 11 输出: 1 4 7 10
```
```shell
-f, --format=格式 使用printf 样式的浮点格式
$(seq -f "%3g" 9 11) 输出(%3代表三位不足地方空格表示,%03代表三位不足地方0表示):
9
10
11
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
--help 显示此帮助信息并退出
--version 显示版本信息并退出
```
##### 端口占用
```shell
netstat -tunlp |grep 80
lsof -i:80
while read line
do
echo $line
done
awd -F ":" {print $NF}
// GetNetworkInterface "ip addr |grep %s | awk -F \" *\" '{print $NF}'"
GetNetworkInterface = "ifconfig |grep %s -1 |head -n1|cut -d\":\" -f1"
pstree 获取进程的子进程
```
暂无评论