江苏中小企业网站建设,做妇产科网站,使用网站模板侵权吗,.net 快速网站开发1. shell变量扩展
我们知道#xff0c;${var}的形式可以获取变量var的值#xff0c;但其实还可以有更多花式玩法。其中#xff5e;表示用户根目录其实属于 波浪线扩展#xff0c;这比较常见#xff0c;不展开介绍了。 下面的每种情况中#xff0c;word 都要经过波浪线扩…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_nameval
$ valBash expansion
$ echo ${!var_name}
Bash expansion所以${!var_name}等效于${val}就是取val_name的值作为变量名再获取新变量名的值。
!有一种例外情况那就是${!prefix*}下面再介绍。
1.2 什么是 ${!prefix*}#
${!prefix*}实现扩展为名称以 prefix 开始的变量名以特殊变量 IFS 的第一个字符分隔。换句话说这种用法就是用于获取变量名的。例如
# 创建3个以VAR开头的变量
$ VAR_Aa
$ VAR_Bb
$ VAR_Cc
# 寻找以VAR开头的变量名
$ echo ${!VAR*}
VAR_A VAR_B VAR_C1.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的开始位置寻找匹配一个#的是寻找最短匹配两个#的是寻找最长匹配把匹配的内容删除后把剩下的返回。例如
$ strwe 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中删除匹配的内容后返回。%与#非常类似前者是从头开始匹配后者是从尾部开始匹配。同样的一个%是寻找最短匹配两个%%是寻找最长匹配。例如
$ strwe 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}主要实现了字符串替换当然如果要替换的结果是空就等效于删除。一个/表示只有第一个匹配的被替换两个/表示所有匹配的都替换。例如
$ strwe 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是一个数组变量下标是或者是*模式删除将依次施用于数组中的每个成员最后扩展为结果的列表。