bash 常见字符串或变量操作快速理解及速查
1. 左删除:${var#*.}
-
#:从最左端开始确定第一个匹配模式
*.
的字符串范围,并删除符合该模式的字符串$ vim test.sh ============= var="bash.hello.world" echo ${var#*.} $ bash test.sh ============== hello.world
-
##:__【贪婪模式】__从最左端开始确定匹配模式
*.
的最长范围,并删除符合该模式的字符串$ vim test.sh ============= var="bash.hello.world" echo ${var##*.} $ bash test.sh ============== world
注:
1. `#` 在键盘上位于 `$` 的左边,所以方便记忆为「从左开始删除」;
2. `*` 是 bash 中的通配符(Wildcard),表示出现 0 次或多次的任意字符;
3. `*.` 匹配任意长并以 `.` 作为尾端的字符串;
实例延伸:
$ vim test.sh
=============
var="123test bash.hello.world"
# 删除 `var` 中最左侧空格及其左边的任意字符串
echo ${var#* }
>>> bash.hello.world
# 利用通配符 `?` 表示任意一个字符
# 删除字符串的第一个字符
echo ${var#?}
>>> 23test bash.hello.world
# 利用通配符 `[]` 表示可匹配的字符范围
# 删除字符串中以任意字母为开始,并以最左端 `.` 为结束的字符串
echo ${var#[0-9]*.}
>>> hello.world
# 删除字符串中以任意字母为开始,并以最右端 `.` 为结束的字符串
echo ${var##[0-9]*.}
>>> world
2. 右删除:${var%.*}
-
% :从最右端开始确定第一个匹配模式
.*
的字符串范围,并删除符合该模式的字符串$ vim test.sh ============= var="bash.hello.world" echo ${var%.*} $ bash test.sh ============== bash.hello
-
%%:【贪婪模式】 从最右端开始确定匹配模式
.*
的最长范围,并删除符合该模式的字符串$ vim test.sh ============= var="bash.hello.world" echo ${var%%.*} $ bash test.sh ============== bash
注:
1. `%` 在键盘上位于 `$` 的右边,所以方便记忆为「从右开始删除」;
2. `*` 是 bash 中的通配符(Wildcard),表示出现 0 次或多次的任意字符;
3. `.*` 匹配任意长并以 `.` 作为开始的字符串;
实例延伸:
$ vim test.sh
=============
var="bash.hello.world test"
# 删除 `var` 中最右侧空格及其右边的任意字符串
echo ${var% *}
>>> bash.hello.world
# 利用通配符 `?` 表示任意一个字符
# 删除字符串的最后一个字符
echo ${var%?}
>>> bash.hello.world tes
# 利用通配符 `[]` 表示可匹配的字符范围
# 删除字符串中以最右端 `.` 为开始,并以任意字母结束的字符串
echo ${var%.*[a-zA-Z]}
>>> bash.hello
# 删除字符串中以最左端 `.` 为开始,并以任意字母结束的字符串
echo ${var%%.*[a-zA-Z]}
>>> bash
3. 替换部分字符:${var/pattern/string}
-
/pattern/string:从左端开始,确定第一个匹配
pattern
的字符串范围,并替换为string
$ vim test.sh ============= var="bash.hello.world" echo -e ${var/./\\n} $ bash test.sh ============== bash hello.world
-
/# or /%pattern/string:【位置相关】 当且仅当开头或末尾匹配
pattern
时,进行替换$ vim test.sh ============= var="test-test-test" echo -e ${var/-test/\\nnew} >>> test new-test echo -e ${var//-test/\\nnew} >>> test new new echo -e ${var/#-test/\\nnew} >>> test-test-test echo -e ${var/%-test/\\nnew} >>> test-test new
-
//pattern/string:【贪婪模式】 匹配所有满足
pattern
的字串串,全部替换为string
$ vim test.sh ============= var="bash.hello.world" echo -e ${var//./\\n} $ bash test.sh ============== bash hello world
注
1. `\` 为 bash 中的特殊字母,实现转义功能。`\\` 表示正常字符 `\`;
2. `echo -e` 中的 `-e` 使转义字符(如\n。\t)生效;
实例延伸
$ bash terminal
# 将系统环境变量中的 PATH 逐行打印
echo -e ${PATH//:/\\n}
4. 替代原有值:${var:-value}
- ${var-value}:如果变量
var
还未定义(unset
),则返回value
,否则返回var
的原始值 - ${var:-value}:如果变量
var
还未定义(unset
)或值为空,则返回value
,否则返回var
的原始值 - ${var+value}:如果变量
var
存在(已定义),则返回value
- ${var:+value}:如果变量
var
存在(已定义)且值非空,则返回value
注
1. 根据 `var` 的现有状态决定是否返回目标 `value`;
2. `-` 和 `+` 假设变量的定义状态;
3. `:` 假设变量是否为空;
实例延伸
$ vim test.sh
=============
# 判断 var 是否存在,并进行报告
var_set="var_set's value"
var_empty=""
if [ -z ${var+x} ]; then echo "var is unset"; else echo "${var}"; fi
if [ -z ${var_set+x} ]; then echo "var_set is unset"; else echo "${var_set}"; fi
if [ -z ${var_empty+x} ]; then echo "var_empty is unset"; else echo "${var_empty}"; fi
$ bash test.sh
=============
line 1: var is unset
line 2: var_set's value
line 3:
一目了然
echo ${#var}
:返回字符串长度;echo ${var?error}
:如果var
还未定义,返回 error 并退出;echo ${var:?error}
:如果var
还未定义或值为空,返回 error 并退出;echo ${var:index}
:按照索引返回字符;echo ${var: negativeIndex}
:注意negativeIndex
前的空格,按照负数索引返回末端abs(negativeIndex)
个字符;echo ${var:index:length}
:按照索引及长度返回范围内的字符串;