【Shell秒懂系列】常见字符串或变量操作快速理解及速查

10 篇文章 0 订阅


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}:按照索引及长度返回范围内的字符串;

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值