美文网首页
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参数扩展

    ${parameter:-word}如果parameter没有设置或者为null,则整个参数扩展(这里为 ${pa...

  • shell参数扩展${}

    看别人的shell脚本看到了陌生的"${}"用法,尽管能看出来在脚本中是做什么的,还是去学习一下,找到了参考中的那...

  • Shell Bash 中的参数扩展

    对于访问 $9 之后的位置参数也同样需要使用大括号,比如: 间接参数扩展: 上述语句中,被引用的参数不是 PARA...

  • Ubuntu16.04+Gnome3

    GNOME优化工具 GNOME Tweak Tool GNOME Shell扩展站点 GNOME Shell扩展站...

  • Shell脚本基础

    1.Shell变量 2.Shell字符串 3.Shell数组 4.Shell注释 5.Shell参数传递 参数处理...

  • Linux常用命令汇总之内建命令

    : 扩展参数列表,执行重定向操作 . 读取并执行指定文件中的命令(在当前shell环境中) alias 为指定命令...

  • gnome tiling 窗口

    安装扩展 material shell

  • Linux常用通配符与参数扩展

    通配符与参数扩展 通配符:*、?、!、()、[]、{}参数扩展:%、%%、#、##、/、//、:、:: 通配符 字...

  • shell脚本编程

    shell脚本的扩展名为 .sh #! 是一个约定的标记,后面的参数/bin/bash告诉系统这个脚本需要什么解释...

  • shell内建命令一览

    命令说明:扩展参数列表,执行重定向操作.读取并执行指定文件中的命令(在当前 shell 环境中)alias为指定命...

网友评论

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

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