偶然间看到一个 shell 脚本:
#!/bin/sh
eureka_url_list="http://eureka0.svc.default.local,http://eureka1.svc.default.local,"
eureka_url_list=${eureka_url_list%?}
echo "$eureka_url_list"
运行脚本,输出:
http://eureka0.svc.default.local,http://eureka1.svc.default.local
原始字符串末尾的逗号被删除了。
Shell 掐头去尾法
# 表示掐头,% 表示去尾
单个 # 或 % 表示最小匹配,两个 # 或 % 表示最大匹配
栗子:
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个和1个) | 前面的字符出现任意次 |
? | 任意一个字符 | 前面的字符出现0次或1次 |
. | 就表示一个点,无特殊意义 | 任意一个字符 |