LinuxSir.cn,穿越时空的Linuxsir!

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

%是什么意思?

[复制链接]
发表于 2007-12-10 18:38:51 | 显示全部楼层 |阅读模式
hi,我有个问题请教大家。
1.
#!/bin/bash
MyVar=".Blue/Green/Red/Yello."
echo ${MyVar#}   

#是注释符号,但是这个shell执行一点问题也没有。
结果是
.Blue/Green/Red/Yello.
但是"}"不是被注释掉了嘛?为什么没有报错呢?
如果我把
echo ${MyVar#}  
改为
echo ${MyVar

就报错。

2.
#!/bin/bash
MyVar=".Blue/Green/Red/Yello."
echo ${MyVar#}
val=${MyVar%%/*}
echo $val

这里的%%是什么意思啊?
我在pattern中没发现有%的方面。
谢谢先。
发表于 2007-12-10 19:24:56 | 显示全部楼层
这里涉及到shell中变量替换中的字符串处理,${var#pattern},${var##pattern},${var%pattern},${var%%pattern}分别是移出最小前缀,最大前缀,最小后缀,最大后缀,这个可以看bash中关于变量展开部分的帮助。#字符只有在一个word的开头才表示以后的是注释。当然这就要涉及到bash如何parse输入的内容了。如果运行如下命令:echo ${MyVar#*/}#hello,就会连#hello也输出出来,如果在#加一个空格,就不会输出#hello了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-10 19:46:37 | 显示全部楼层
刚才去IRC问问,是这样的。谢谢。
不过对于#的问题, 这里我写错了。
应该是
  1. echo ${MyVar#Green}
复制代码
您说,#字符只有在一个word的开头才表示以后的是注释。
但是好像这里的“}”没有parse。我想{}中的#后边的内容,到"}" 之前都被认为是注释了。

道行不深,多谢指教。

PS:
http://wooledge.org:8000/BashFAQ/073
预览
Here's an example of how to use parameter expansion with something akin to a hostname (dot-separated components):

parameter     result
-----------   ------------------------------
${NAME}       polish.ostrich.racing.champion
${NAME#*.}           ostrich.racing.champion
${NAME##*.}                         champion
${NAME%%.*}   polish                        
${NAME%.*}    polish.ostrich.racing         

And, here's an example of the parameter expansions for a typical filename.

parameter     result
-----------   --------------------------------------------------------
${FILE}       /usr/share/java-1.4.2-sun/demo/applets/Clock/Clock.class
${FILE#*/}     usr/share/java-1.4.2-sun/demo/applets/Clock/Clock.class
${FILE##*/}                                                Clock.class
${FILE%%/*}                                                           
${FILE%/*}    /usr/share/java-1.4.2-sun/demo/applets/Clock            
回复 支持 反对

使用道具 举报

发表于 2007-12-10 20:07:47 | 显示全部楼层
就像在""里面的#不会被当成注释来处理似的,这里可能也会被特殊处理吧,这个要看bash的源代码才可能说清楚。
  1. echo ${MyVar#Green}
复制代码
由于Green并不能匹配MyVar的开头,所以不会进行处理。按照bash的手册,bash只会在控制字符和空格处把输入分割成word,这个就要具体的看帮助和从书本上了解了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-12 16:00:32 | 显示全部楼层
Million tks !
Understood completely!
Actually I checked 'man bash' and find out the meaning on '%', but was sitll confused.

when I modified as the following code:

  1. MyVar=".Blue/Green/Red/Yellow."
  2. echo ${MyVar#.}
复制代码

The result is 'Blue/Green/Red/Yellow.'

you are right, firstly try to match the string and then do some certain operations.

Tks again!
回复 支持 反对

使用道具 举报

发表于 2007-12-13 08:02:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

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