美文网首页
shell参数扩展${}

shell参数扩展${}

作者: 灵木er | 来源:发表于2020-10-01 10:50 被阅读0次

    image

    看别人的shell脚本看到了陌生的"${}"用法,尽管能看出来在脚本中是做什么的,还是去学习一下,找到了参考中的那篇博客,写的很清楚。在这里只是添加几个例子,那篇博客只是写了用法没有例子,也是看用法不是太明白,动手搞搞例子就清楚了。

    这里要写的例子如下:${parameter:-word};${parameter:=word};${parameter:?word};${parameter:+word};${#parameter};${parater%word} and ${parameter%%word};${parameter#word} and ${parameter##word};${parameter:index} and ${parameter:index:length};${parameter/pattern/string} and ${parameter//pattern//string}。

    ${parameter:-word}

    如果parameter为null或者未设置,整个参数替换表达式值为word

    i='abc'
    echo -e "\033[32m $i \033[0m"
    echo -e "\033[33m ${i:-word} \033[0m"
    echo -e "\033[31m ${j:-word} \033[0m"
    echo -e "\033[32m $j \033[0m"
    
    image

    因为参数(i)不为空,所以表达式还是原来的值;
    因为“j”未设置,所以表达式是“word”

    ${parameter:=word}

    如果parameter为null或者未设置,整个参数替换表达式值为word,并且parameter参数值设置为word

    i='abc'
    echo -e "\033[32m $i \033[0m"
    echo -e "\033[33m ${i:=word} \033[0m"
    echo -e "\033[31m ${j:=word} \033[0m"
    echo -e "\033[32m $j \033[0m"
    
    image

    和上面的一对比就清楚了,上面的“j”为空,这里的“j”已经成了“word”

    ${parameter:?word}

    如果parameter为null或者未设置,则打印出错误信息。否则,整个参数替换表达式值为$parameter

    i='abc'
    echo -e "\033[32m $i \033[0m"
    echo -e "\033[33m ${i:?word} \033[0m"
    # echo -e "\033[31m ${j:?word} \033[0m"
    echo -e "\033[32m $j \033[0m"
    
    image

    由于出错信息很碍眼,就注释掉了,简单说就是参数存在还是原来的值,不存在就报错

    ${parameter:+word}

    如果parameter不为null或者未设置,则整个参数替换表达式值为word

    i='abc'
    echo -e "\033[32m $i \033[0m"
    echo -e "\033[33m ${i:+word} \033[0m"
    echo -e "\033[31m ${j:+word} \033[0m"
    echo -e "\033[32m $j \033[0m"
    
    image

    可以明显的看出来,参数存在则替换,不存在就不管

    ${#parameter}

    返回参数值的字符串的长度,无需多说

    i='abc'
    echo -e "\033[32m ${#i} \033[0m"
    
    image

    ${parater%word} and ${parameter%%word}

    从尾开始扫描word,将匹配word正则表达式的字符过滤掉
    %为最短匹配,%%为最长匹配

    i='hello z world'
    echo -e "\033[32m $i \033[0m"
    echo -e "\033[33m ${i%[world]*d} \033[0m"
    echo -e "\033[31m ${i%%[world]*d} \033[0m"
    j='aabbcc'
    echo -e "\033[32m $j \033[0m"
    echo -e "\033[33m ${j%c} \033[0m"
    echo -e "\033[31m ${j%%c} \033[0m"
    
    image

    可以看出来使用正则表达式的*号进行多次匹配是有区别的,完全匹配则没有差别

    ${parameter#word} and ${parameter##word}

    从头开始扫描word,将匹配word正则表达的字符过滤掉

    为最短匹配,##为最长匹配

    j='aabbcc abc'
    echo -e "\033[32m $j \033[0m"
    echo -e "\033[33m ${j#a} \033[0m"
    echo -e "\033[31m ${j##a} \033[0m"
    echo -e "\033[33m ${j#a*} \033[0m"
    echo -e "\033[31m ${j##a?} \033[0m"
    echo -e "\033[34m ${j##a*b} \033[0m"
    
    image

    这里的正则表达式匹配过滤大概是这样

    ${parameter:index} and ${parameter:index:length}

    从index截取到结束和从index截取长度为length个字符

    例子就省掉了,看过前面的例子应该可以自己解决

    ${parameter/pattern/string} and ${parameter//pattern//string}

    将parameter对应值的pattern字符串替换成为string字符串
    /表示只替换一次
    //表示全部替换

    不清楚的自己动手尝试就明白了

    觉得这部分可以代替部分sed和awk功能,当然了,sed和awk更强大,暂时能想到的作用就是过滤字符和替换

    双节快乐呀!

    reference

    相关文章

      网友评论

          本文标题:shell参数扩展${}

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