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更强大,暂时能想到的作用就是过滤字符和替换
双节快乐呀!
网友评论