美文网首页
shell中${}的使用

shell中${}的使用

作者: 渐悟懂劲 | 来源:发表于2019-04-05 14:38 被阅读0次

    在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 变量字符串的长度

    相关文章

      网友评论

          本文标题:shell中${}的使用

          本文链接:https://www.haomeiwen.com/subject/uwbhiqtx.html