wordpress4.7.5下载百度seo排名360
1. shell变量扩展
我们知道,${var}的形式可以获取变量var的值,但其实还可以有更多花式玩法。其中~表示用户根目录其实属于 波浪线扩展,这比较常见,不展开介绍了。
下面的每种情况中,word 都要经过波浪线扩展,参数扩展,命令替换和 算术扩展。如果不进行子字符串扩展,bash 测试一个没有定义或值为空的 参数;忽略冒号的结果是只测试未定义的参数。
大致描述下变量扩展的功能:
扩展 | 功能 |
---|---|
${var} | 获取变量值 |
${!var} | 取变量var的值做新的变量名,再次获取新变量名的值 |
${!prefix* | 获取prefix开头的变量名 |
${#parameter} | 获取变量长度 |
${parameter:-word} | parameter为空时,使用wrod返回 |
${parameter:+word} | parameter非空时,使用word返回 |
${parameter:=word} | parameter为空时,使用word返回,同时把word赋值给parameter变量 |
${parameter:?word} | parameter为空时,打印错误信息word |
${parameter:offset} | 从offset位置截取字符串 |
${parameter:offset:length | 从offset位置截取length长度的字符串 |
${parameter#word} | 从头开始删除最短匹配word模式的内容后返回 |
${parameter##word} | 从头开始删除最长匹配word模式的内容后返回 |
${parameter%word} | 从尾开始删除最短匹配word模式的内容后返回 |
${parameter%%word} | 从尾开始删除最长匹配word模式的内容后返回 |
${parameter/pattern/string} | 最长匹配pattern的内容替换为string |
${parameter//pattern/string} | 所有匹配pattern的内容替换为string |
1.1 什么是${!var}
${!var}是间接扩展。bash 使用以 var 的其余部分为名的变量的值作为变量的名称; 接下来新的变量被扩展,它的值用在随后的替换当中,而不是使用var自身的值。
有点拗口,举个例子就懂了
$ var_name=val
$ val="Bash expansion"
$ echo ${!var_name}
Bash expansion
所以,${!var_name}等效于${val},就是取val_name的值作为变量名,再获取新变量名的值。
!有一种例外情况,那就是${!prefix*},下面再介绍。
1.2 什么是 ${!prefix*}#
${!prefix*}实现扩展为名称以 prefix 开始的变量名,以特殊变量 IFS 的第一个字符分隔。换句话说,这种用法就是用于获取变量名的。例如:
# 创建3个以VAR开头的变量
$ VAR_A=a
$ VAR_B=b
$ VAR_C=c
# 寻找以VAR开头的变量名
$ echo ${!VAR*}
VAR_A VAR_B VAR_C
1.3 什么是 ${parameter:-word}
${parameter:-word}表示使用默认值。如果 parameter 未定义或值为空,将替换为 word 的扩展。否则,将替换为 parameter 的值。
1.4 什么是${parameter:=word}
${parameter:=word}赋默认值。如果 parameter 未定义或值为空, word 的扩展将赋予 parameter。parameter 的值将被替换。位置参数和特殊参数不能用这种方式赋值。
${parameter:=word}和${parameter:-word}有什么差别?
举个例子:
# 删除var变量
$ unset var
# 确认var变量为空
$ echo ${var}# 当var为空时,把test赋值给var,同时返回test
$ echo ${var:=test}
test
# 可以看到,此时var已经被赋值
$ echo ${var}
test
# 再次删除var变量,继续实验
$ unset var
# 当var为空时,返回test
$ echo ${var:-test}
test
# 对比验证,此时var并没有赋值
$ echo ${var}
所以,差别在于,当parameter为空时,${parameter:=word}会比${parameter:-word}多做一步,就是把word的值赋给parameter。
1.6什么是${parameter:?word}
${parameter:?word}主要用于当parameter为空时,显示错误信息word。shell 如果不是交互的,则将退出。
1.7 什么是${parameter:+word}
如果 parameter 未定义或非空,不会进行替换;否则将替换为 word 扩展后的值。这与${parameter:-word}完全相反。简单来说,就是当parameter非空时,才使用word。
1.8 什么是${parameter:offset}
同 ${parameter:offset:length}
${parameter:offset:length}可以实现字符串的截取,从offset开始,截取length个字符。如果 offset 求值结果小于 0, 值将当作从 parameter 的值的末尾算起的偏移量。如果parameter 是 @,结果是 length 个位置参数,从 offset 开始。 如果 parameter 是一个数组名,以 @ 或 * 索引,结果是数组的 length 个成员,从 ${parameter[offset]} 开始。 子字符串的下标是从 0 开始的,除非使用位置参数时,下标从 1 开始。
1.9 什么是${parameter#word}#
参考 ${parameter##word}
${parameter##word}
word支持模式匹配,从parameter的开始位置寻找匹配,一个#的是寻找最短匹配,两个#的是寻找最长匹配,把匹配的内容删除后,把剩下的返回。例如:
$ str="we are testing, we are testing"
$ echo ${str#*are}
testing, we are testing
$ echo ${str##*are}
testing
这必须是从头开始删的,如果要删除中间的某一些字符串,可以用${parameter/pattern/string}。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。
1.10 什么是${parameter%word}
参考${parameter%%word}
${parameter%%word}
这也是在parameter中删除匹配的内容后返回。%与#非常类似,前者是从头开始匹配,后者是从尾部开始匹配。同样的,一个%是寻找最短匹配,两个%%是寻找最长匹配。例如:
$ str="we are testing, we are testing"
$ echo ${str%are*}
we are testing, we
$ echo ${str%%are*}
we
这必须是从末端开始删的,如果要删除中间的某一些字符串,可以用${parameter/pattern/string}。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。
1.11 什么是${parameter/pattern/string}
参考${parameter//pattern/string}
${parameter//pattern/string}和${parameter/pattern/string},主要实现了字符串替换,当然,如果要替换的结果是空,就等效于删除。一个/,表示只有第一个匹配的被替换,两个/表示所有匹配的都替换。例如:
$ str="we are testing, we are testing"
# 替换首次匹配
$ echo ${str/we are/I am}
I am testing, we are testing
# 替换所有匹配
$ echo ${str//we are/I am}
I am testing, I am testing
# 删除首次匹配
$ echo ${str/are/}
we testing, we are testing
# 删除所有匹配
$ echo ${str//are/}
we testing, we testing
如果patten以#开始,例如KaTeX parse error: Expected '}', got '#' at position 6: {str/#̲we are/},则必须从头开…{str/%are testing/},必须从末端就要完全匹配。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。