#:从最左端开始确定第一个匹配模式 *. 的字符串范围,并删除符合该模式的字符串
$ 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% :从最右端开始确定第一个匹配模式 .* 的字符串范围,并删除符合该模式的字符串
$ 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/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}注
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 is unset"; else echo "${var_set}"; fi if [ -z ${var_empty+x} ]; then echo "var is unset"; else echo "${var_empty}"; fi $ bash test.sh ============= line 1: var is unset line 2: var_set's value line 3:Advanced Bash-Scripting Guide: Chapter 10. Manipulating Variables
