LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 734|回复: 6

关于${arch##*.}

[复制链接]
发表于 2006-1-22 17:46:45 | 显示全部楼层 |阅读模式
精华区有这样一个脚本:
#!/bin/sh
for arch in $(ls | egrep '*.tar.[bg]z(2|)'); do
      case ${arch##*.} in
               bz2) tar jxf $arch -C /tmp & ;;
               *) tar zxf  $arch -C /tmp & ;;
      esac   
done
wait
请问其中的${arch##*.}是什么语法?
发表于 2006-1-22 18:16:34 | 显示全部楼层
  1. [No.507 18:15:06 ~]$ var=123A456A789
  2. [No.508 18:15:16 ~]$ echo ${var#*A}
  3. 456A789
  4. [No.509 18:15:37 ~]$ echo ${var##*A}
  5. 789
  6. [No.510 18:15:43 ~]$ echo ${var%A*}
  7. 123A456
  8. [No.511 18:15:57 ~]$ echo ${var%%A*}
  9. 123
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-22 22:34:03 | 显示全部楼层
大概是截取字符?不过没有看出规律来啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-22 23:03:33 | 显示全部楼层
看明白了一点点:
[No.507 18:15:06 ~]$ var=123A456A789
[No.508 18:15:16 ~]$ echo ${var#*A}
456A789
----#*A表示第一个A字符之后的所有字符,#表示第一个,*在A前表示取A后面
[No.509 18:15:37 ~]$ echo ${var##*A}
789
----##*A表示第二个A字符之后的所有字符,##表示第一个,*在A前表示取A后面
[No.510 18:15:43 ~]$ echo ${var%A*}
123A456
----%A*表示第一个A字符之前的所有字符,%表示第一个,*在A后表示取A前面
[No.511 18:15:57 ~]$ echo ${var%%A*}
123
----%%A*表示第一个A字符之前的所有字符,%%表示第一个,*在A后表示取A前面

但是为什么#A*不是表示取第一个A前面的字符呢?
回复 支持 反对

使用道具 举报

发表于 2006-1-23 00:50:39 | 显示全部楼层
# 操作是保留后边的子串
% 操作是保留前边的子串

#A*?
你想得到什么结果?
回复 支持 反对

使用道具 举报

发表于 2006-1-23 11:59:25 | 显示全部楼层
引用
字符匹配
#:从左边开始取最小匹配并删除
##:从左边开始取最大匹配并删除
例:
i=/home/abc/def
则:
${i#/}后i的值为:/abc/def
${i##/}后i的值为:def

%和%%同上,只不过是从右边开始匹配
回复 支持 反对

使用道具 举报

发表于 2006-1-23 12:16:55 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表