Linux变量的常用操作

变量内容的删除与替换

其中关键字是可以使用 * 来作为通配符(0到无穷个任意字符)

  1. ${变量#关键字} 若变量的内容从头开始符合“关键字”,则将符合的最短数据删除
  2. ${变量##关键字} 若变量的内容从头开始符合“关键字”,则将符合的最长数据删除
  3. ${变量%关键字} 若变量的内容从尾部开始符合“关键字”,则将符合的最短数据删除
  4. ${变量%%关键字} 若变量的内容从尾部开始符合“关键字”,则将符合的最长数据删除
  5. ${变量/旧字符串/新字符串} 若变量的内容符合旧字符串,则第一个旧字符串会被替换为新字符串
  6. ${变量//旧字符串/新字符串 } 若变量的内容符合旧字符串,则所有旧字符串会被替换为新字符串

其实很好记忆,就是,**# 表示从左到右,%表示从右到左,/ 表示替换,类似于Sed中的替换语法。**双个符号叠加,表示作用范围扩大(匹配由最短–> 最长,替换由单个–> 全部)。

很多时候我们关注的可能是变量的头部和尾部字符串,配合 * 通配符可以很容易实现“字符串的匹配删除”:

  1. 删除变量的头部到关键词之间到内容,eg. ${变量#*关键字}
  2. 删除变量从关键词到尾部之间的内容,eg. ${变量%关键字*}
  3. 替代变量的头部到关键词之间到内容,eg. ${string/#substring/replacement},个人感觉和默认效果表现一致(可忽略)
  4. 替代变量的关键词到尾部之间到内容,eg. ${string/%substring/replacement}

举例说明:

➜  ~ string="abcab abcab"
# 删除举例
➜  ~ echo ${string#ab}
cab abcab
➜  ~ echo ${string#*ab}
cab abcab
➜  ~ echo ${string##*ab}

➜  ~ echo ${string%ab}
abcab abc
➜  ~ echo ${string%ab*}
abcab abc
➜  ~ echo ${string%%ab*}

# 替换举例
➜  ~ echo ${string/ab/ef}
efcab abcab
➜  ~ echo ${string//ab/ef}
efcef efcef
➜  ~ echo ${string/#ab/ef}
efcab abcab
➜  ~ echo ${string/%ab/ef}
abcab abcef

字符串截取

有如下3种方式:

  1. 使用${}表达式,使用格式,${var:起始位置:长度};编号从0开始,可省略 。
  2. 使用expr substr ,使用格式expr substr "$var" 起始位置 长度;起始位置编号从1开始。
  3. 使用 cut工具,使用格式 echo $var | cut -b 起始位置-结束位置;起始位置编号从1开始。

下面举例说明:(从abcdefg 字符串中,截取 ab 子串)。

[root@9ead543f165e /]# echo ${string:0:2}
ab

[root@9ead543f165e /]# expr substr $string 1 2
ab

[root@9ead543f165e /]# echo $string | cut -b 1-2
ab

变量初值处理

对变量的非空情况做处理

  1. 取值,${var:-word}, 若变量var已存在且非null,则返回$var的值;否则返回字串"word",变量var值不变。 用途: 如果变量没定义返回默认值。

  2. 赋值,${var:=word}, 若变量var已存在且非null,则返回$var的值;否则返回字串"word",并赋值给变量var。 用途: 如果变量没定义给变量赋值。

  3. 有值时提示,${var:+"提示信息"},若变量var已存在且非null,则给出提示,否则返回NUll(空值)。 用途 : 测试变量是否定义。

  4. 无值时提示,无值时提示,${var:?"提示信息"},若变量var已存在且非null,则返回$var的值。否则给出提示信息(若省略,则用默认提示)。用途: 捕捉由于变量未定义所导致的错误

判断是否以某些字符开头

==比较

使用bash检查字符串是否以某些字符开头可以使用==比较

[[ $str == h* ]]

示例

str="hello"
if [[ $str == h* ]];
then
 echo 'yes'
fi

有两个地方需要注意:

  1. h*不需要使用引号括起来,使用引号括起来是直接做相等比较
  2. 比较语句使用双中括号括起来,而不是使用单中括号

=~正则比较

如果使用Bash的正则

str="hello"
if [[ "$str" =~ ^he.* ]]; then
    echo "yes"
fi

使用正则匹配字符串的开头字符需要注意:

  • he*:不要使用he*,这里的*号表示e字符0到多个,即h,以及heeee都是测试通过的
  • he.*:这里只允许包含he的字符串通过测试
  • ^he.*:这个表示是以he开头的字符串通过检测

Shell $0, $#, $*, $@, $?, $$和命令行参数

变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

$*$@ 的区别

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1", “$2”, …,"$n" 的形式输出所有参数。但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"; 的 形 式 输 出 所 有 参 数 ;而"$@" 不变仍然能够分开各个参数。

参考资料


  1. 十 字符串处理 - osc_vk5ke3ie的个人空间 - OSCHINA - 中文开源技术交流社区
  2. Shell笔记_小路恢宏随手记-CSDN博客
  3. Linux shell 中 ( ) ‘ ‘ , () ` `, (){},$[] $(()),[ ] (( )) [[ ]]作用与区别_我伦威武的博客-CSDN博客
  4. Linux中的括号用法-12620492-51CTO博客
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值