文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>shell学习<变量游离>

shell学习<变量游离>

时间:2007-08-30  来源:ank

(-)操作字符串 1求字符串长度
${#string}
expr length $string
expr "$string" : '.*'
  2提取子串 ${string:position}
在$string中从位置$position开始提取子串.
${string:position:length}
在$string中从位置$position开始提取$length长度的子串.
如果$string参数是"*"或"@", 那么将会从$position位置开始提取$length个位置参数, 但是由于可能没有$length个位置参数了, 那么就有几个位置参数就提取几个位置参数.   1 echo ${*:2}          # 打印出第2个和后边所有的位置参数.
  2 echo ${@:2}          # 同上.
  3
  4 echo ${*:2:3}        # 从第2个开始, 连续打印3个位置参数. 
截掉子串
${string#substring}
从$string的开头位置截掉最短匹配的$substring.
${string##substring}
从$string的开头位置截掉最长匹配的$substring
${string%substring}
从$string的结尾位置截掉最短匹配的$substring.
${string%%substring}
从$string的结尾位置截掉最长匹配的$substrin
${string%substring}
从$string的结尾位置截掉最短匹配的$substring.
${string%%substring}
从$string的结尾位置截掉最长匹配的$substring
  子串替换
${string/substring/replacement}
使用$replacement来替换第一个匹配的$substring.
${string//substring/replacement}
使用$replacement来替换所有匹配的$substring.
  ${string/#substring/replacement}
如果$substring匹配$string的开头部分<只匹配开头部分>, 那么就用$replacement来替换$substring.
${string/%substring/replacement}
如果$substring匹配$string的结尾部分<只结尾开头部分>, 那么就用$replacement来替换$substring.
 
  (二)参数替换   $parameter是${parameter}的简写,在某些上下文中, ${parameter}很少会产生混淆.
可以把变量和字符串组合起来使用.

${parameter-default}, ${parameter:-default}
${parameter-default} -- 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} -- 如果变量parameter没被设置, 那么就使用默认值.

${parameter-default} 和${parameter:-default}在绝大多数的情况下都是相同的. 只有在parameter已经被声明, 但是被赋null值得时候, 这个额外的:才会产生不同的结果.
 
 
 
${parameter=default}, ${parameter:=default}
${parameter=default} -- 如果变量parameter没声明, 那么就把它的值设为default.
${parameter:=default} -- 如果变量parameter没设置, 那么就把它的值设为default.

这两种形式基本上是一样的. 只有在变量$parameter被声明并且被设置为null值的时候, :才会引起这两种形式的不同. [1] 如上边所示.
      ${parameter+alt_value}, ${parameter:+alt_value}
${parameter+alt_value} -- 如果变量parameter被声明了, 那么就使用alt_value, 否则就使用null字符串.
${parameter:+alt_value} -- 如果变量parameter被设置了, 那么就使用alt_value, 否则就使用null字符串.

这两种形式绝大多数情况下都一样. 只有在parameter被声明并且设置为null值的时候, 多出来的这个:才会引起这两种形式的不同, 具体请看下边的例子.
   
${parameter?err_msg}, ${parameter:?err_msg}
${parameter?err_msg} -- 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.
${parameter:?err_msg} -- 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.

这两种形式绝大多数情况都是一样的. 和上边所讲的情况一样, 只有在parameter被声明并设置为null值的时候, 多出来的:才会引起这两种形式的不同.
        ${#var}
字符串长度(变量$var得字符个数). 对于array来说, ${#array}表示的是数组中第一个元素的长度.
( 例外  ${#*}和${#@}表示位置参数的个数.对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.   )
    ${!varprefix*}, ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix开头的变量. 
  1 xyz23=whatever
  2 xyz24=
  3
  4 a=${!xyz*}      # 展开所有以"xyz"开头的, 并且之前声明过的变量名.
  5 echo "a = $a"   # a = xyz23 xyz24
  6 a=${!xyz@}      # 同上.
  7 echo "a = $a"   # a = xyz23 xyz24
  8
  9 # Bash, 版本2.04, 添加了这个功能.
  例子 使用模式匹配来解析任意字符串
 1 #!/bin/bash 2  3 var1=abcd-1234-defg 4 echo "var1 = $var1" 5  6 t=${var1#*-*} 7 echo "var1 (with everything, up to and including first - stripped out) = $t" 8 # t=${var1#*-} 也一样, 9 #+ 因为#匹配最短的字符串, 10 #+ 同时*匹配任意前缀, 包括空字符串. 11 # (感谢, Stephane Chazelas, 指出这点.) 12  13 t=${var1##*-*} 14 echo "If var1 contains a \"-\", returns empty string... var1 = $t" 15  16  17 t=${var1%*-*} 18 echo "var1 (with everything from the last - on stripped out) = $t" 19  20 echo 21  22 # ------------------------------------------- 23 path_name=/home/bozo/ideas/thoughts.for.today 24 # ------------------------------------------- 25 echo "path_name = $path_name" 26 t=${path_name##/*/} 27 echo "path_name, stripped of prefixes = $t" 28 # 在这个特例中, 与 t=`basename $path_name` 效果相同. 29 # t=${path_name%/}; t=${t##*/} 是更一般的解决方法. 30 #+ 但有时还是会失败. 31 # 如果$path_name以一个换行符结尾的话, 那么 `basename $path_name` 就不能正常工作了, 32 #+ 但是上边的表达式可以. 33 # (感谢, S.C.) 34  35 t=${path_name%/*.*} 36 # 与 t=`dirname $path_name` 效果相同. 37 echo "path_name, stripped of suffixes = $t" 38 # 在某些情况下将失效, 比如 "../", "/foo////", # "foo/", "/". 39 # 删除后缀, 尤其是在basename没有后缀的情况下, 40 #+ 但是dirname可以, 不过这同时也使问题复杂化了. 41 # (感谢, S.C.) 42  43 echo 44  45 t=${path_name:11} 46 echo "$path_name, with first 11 chars stripped off = $t" 47 t=${path_name:11:5} 48 echo "$path_name, with first 11 chars stripped off, length 5 = $t" 49  50 echo 51  52 t=${path_name/bozo/clown} 53 echo "$path_name with \"bozo\" replaced by \"clown\" = $t" 54 t=${path_name/today/} 55 echo "$path_name with \"today\" deleted = $t" 56 t=${path_name//o/O} 57 echo "$path_name with all o's capitalized = $t" 58 t=${path_name//o/} 59 echo "$path_name with all o's deleted = $t" 60  61 exit 0
 
 
 

例子  修改文件扩展名:

 1 #!/bin/bash 2 # rfe.sh: 修改文件扩展名. 3 # 4 # 用法: rfe old_extension new_extension 5 # 6 # 示例: 7 # 将指定目录中所有的*.gif文件都重命名为*.jpg, 8 # 用法: rfe gif jpg 9  10  11 E_BADARGS=65 12  13 case $# in 14  0|1) # 竖线"|"在这里表示"或"操作. 15  echo "Usage: `basename $0` old_file_suffix new_file_suffix" 16  exit $E_BADARGS # 如果只有0个或1个参数的话, 那么就退出脚本. 17  ;; 18 esac 19  20  21 for filename in *.$1 22 # 以第一个参数为扩展名的全部文件的列表. 23 do 24  mv $filename ${filename%$1}$2 25  # 把筛选出来的文件的扩展名去掉, 因为筛选出来的文件的扩展名都是第一个参数, 26  #+ 然后把第2个参数作为扩展名, 附加到这些文件的后边. 27 done 28  29 exit 0

 

   
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载