Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98684
  • 博文数量: 48
  • 博客积分: 1980
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 15:03
文章分类

全部博文(48)

文章存档

2009年(48)

我的朋友
最近访客

分类:

2009-09-17 22:33:09

参数替换

1.处理和(或)扩展变量
${parameter}与$parameter相同, 也就是变量parameter的值. 可以把变量和字符串组合起来使用.
PATH=${PATH}:/opt/bin  #在脚本的生命周期中, /opt/bin会被添加到$PATH变量中.
 
1.1${parameter-default}, ${parameter:-default}
${parameter-default} -- 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} -- 如果变量parameter没被设置, 那么就使用默认值.
${parameter-default} 和${parameter:-default}在绝大多数的情况下都是相同的.
只有在parameter已经被声明, 但是被赋null值得时候, 这个额外的:才会产生不同的结果.
 
1.2${parameter=default}, ${parameter:=default}
${parameter=default} -- 如果变量parameter没声明, 那么就把它的值设为default.
${parameter:=default} -- 如果变量parameter没设置, 那么就把它的值设为default.
只有在变量$parameter被声明并且被设置为null值的时候, :才会引起这两种形式的不同.
 
1.3${parameter+alt_value}, ${parameter:+alt_value}
${parameter+alt_value} -- 如果变量parameter被声明了, 那么就使用alt_value, 否则就使用null字符串.
${parameter:+alt_value} -- 如果变量parameter被设置了, 那么就使用alt_value, 否则就使用null字符串.
只有在parameter被声明并且设置为null值的时候, 多出来的这个:才会引起这两种形式的不同,
 
1.4${parameter?err_msg}, ${parameter:?err_msg}
${parameter?err_msg} -- 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.
${parameter:?err_msg} -- 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.
只有在parameter被声明并设置为null值的时候, 多出来的:才会引起这两种形式的不同.

2.变量长度/子串删除
 
2.1${#var}字符串长度(变量$var得字符个数).
   对于array来说, ${#array}表示的是数组中第一个元素的长度.
   例外情况:
          ${#*}和${#@}表示位置参数的个数.
          对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.
 
2.2${var#Pattern}, ${var##Pattern}
从变量$var的开头删除最短或最长匹配$Pattern的子串.
这是一个很常见的用法, 请读者牢记, 一个"#"表示匹配最短, "##"表示匹配最长.

2.3${var%Pattern}, ${var%%Pattern}
从变量$var的结尾删除最短或最长匹配$Pattern的子串.
这是一个很常见的用法, 请读者牢记, 一个"%"表示匹配最短, "%%"表示匹配最长

3.变量扩展/子串替换
 
3.1${var:pos} 变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).
 
3.2 ${var:pos:len}变量var从位置pos开始, 并扩展len个字符.
 
3.3 ${var/Pattern/Replacement}
    使用Replacement来替换变量var中第一个匹配Pattern的字符串. 如果省略Replacement, 那么第一个匹配Pattern的字符串将被替换为空, 也就是被删除了.
 
3.4 ${var//Pattern/Replacement}
     全局替换. 所有在变量var匹配Pattern的字符串, 都会被替换为Replacement.
和上边一样, 如果省略Replacement, 那么所有匹配Pattern的字符串, 都将被替换为空, 也就是被删除掉.
 
3.5 ${var/#Pattern/Replacement}
      如果变量var的前缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.
 
3.6 ${var/%Pattern/Replacement}
      如果变量var的后缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.

3.7 ${!varprefix*}, ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix开头的变量. 

注意事项
[1] 如果在一个非交互脚本中, $parameter被设置为null的话, 那么这个脚本将会返回127作为退出状态码(127返回码对应的Bash错误码为命令未发现"command not found").
 
阅读(551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~