shell中${}的使用

在shell中经常要对变量进行字符串的截取操作,虽然截取字符串的方法很多,在这里用${}的方法操作变量应该是最简洁的方式。

1. 最小匹配和最大匹配

shell脚本中经常要对输入的参数截取其路径或文件名,例如变量file中保存着输入参数:

file=/home/user/file1.txt
表达式 作用 结果
${file#*/} 删掉第一个 “/” 及其左边的字符串 home/user/file1.txt
${file##*/} 删掉最后一个 “/” 及其左边的字符串 file1.txt
${file%/*} 删掉最后一个 “/” 及其右边的字符串 /home/user
${file%%/*} 删掉第一个 “/” 及其右边的字符串 (空值)
${file#*.} 删掉第一个 “.” 及其左边的字符串 txt
${file##*.} 删掉最后一个 “.” 及其左边的字符串 txt
${file%.*} 删掉最后一个 “.” 及其右边的字符串 /home/user/file1
${file%%.*} 删掉第一个 “.” 及其右边的字符串 /home/user/file1

这里的最大匹配和最小匹配与正则表达式是不是很像,但是用起来简单方便。

如果觉得不方便记忆,可以这样来看:

键盘上#、 $、%分别对应着3、4、5

  • # 是 去掉左边(键盘上#在 $ 的左边)
  • %是去掉右边(键盘上% 在$ 的右边)
  • 一个符号是最小匹配;两个符号是最大匹配

因此,#/就是以"/"为末尾字符的最小匹配(从左到右),%/就是以"/"为开头字符的最小匹配(从右到左)。

2. 按长度截取字符串

仍然对上面的file变量进行操作,注意字符的位置从0开始

表达式 作用 结果
${file:0:5} 截取最左边的 5 个字符 /home
${file:1:5} 截取从第2个字符开始的5个字符 home/
${file:5:5} 截取从第6个字符开始的5个字符 /user

3. 字符串替换

表达式 作用 结果
${file/e/o} 把变量中第一个字符"e"替换为字符"o" /homo/user/file1.txt
${file//e/o} 把变量中全部字符"e"替换为字符"o" /homo/usor/filo1.txt

4.根据变量的赋值状态重新赋值

利用 ${ } 还可针对不同的变量赋值状态(未赋值、空值、非空值)返回不同的结果:

表达式 作用
${file-/home} 假如 $file 沒有赋值,則使用 /home 作传回值。($file为空值及非空值时返回变量本身)
${file:-/home} 假如 $file 沒有赋值或为空值,則使用 /home 作传回值。 ($file非空值时返回变量本身)
${file+/home} 假如 $file 有赋值(空值或非空值),则都使用 /home 作传回值。($file沒有赋值则不作处理)
${file:+/home} 假如 $file 为非空值,則使用 /home 作传回值。 ($file沒有赋值或为空值均不作处理)
${file=/home} 假如 $file 沒有赋值,則使用 /home 作传回值,同时将$file赋值为/home。(空值及非空值时不作处理)
${file:=/home} 假如 $file 沒有赋值或为空值,則使用 /home 作传回值,同时将$file赋值为/home。(非空值时不作处理)
${file?/home} 假如 $file 沒有赋值,則將 /home 输出至 STDERR,也就是一条包含/home内容的错误信息。(空值及非空值时不作处理)
${file:?/home} 假如 $file 沒有赋值或为空值,則將 /home 输出至 STDERR,(非空值时不作处理)
${#file} 返回 $file 变量字符串的长度
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,956评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,220评论 0 10
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 13,469评论 3 53
  • 最近接到公司领导要求对产品会员资料功能的录入项进行改进,功能非常简单将原有的某些选填项补充为必填项目,同时资料不完...
    产品空阅读 5,306评论 1 11
  • 1 我出生在大连沿海的一个小渔村,整个村子围绕在一个小小的海湾边,村里所有的人家都靠养殖牡蛎为生,我们家也是如此,...
    如逸说阅读 1,670评论 0 0