分类: LINUX
2015-08-11 20:00:20
使用shell也有一段时间了,第一看到这么写的,也算是学习吧。
虽然,没找到官方给出的解释,但是做了几个实验也基本上能看出这个符号的作用。
1. 我的脚本是这样写的
a = "abcdefg"
echo ${ 1 #$a}
|
运行
~$ bash - x test.sh abcdef
+ a = abcdefg
+ echo abcdef
abcdef
|
~$ bash - x test.sh abcdefg
+ a = abcdefg
+ echo
|
~$ bash - x test.sh abcdefgk
+ a = abcdefg
+ echo k
k
|
2. 脚本是这样写的
a = "abcdefg"
echo ${ 0 #$a}
|
运行结果
~$ bash - x test.sh abcdefgkk /
+ a = abcdefg
+ echo test.sh
test.sh
|
3. 脚本是这样写的
a = "abcdefg"
echo ${ 2 #$a}
|
~$ bash - x test.sh abcdefgkk /
+ a = abcdefg
+ echo
|
~$ bash - x test.sh abcdefgkk / abc
+ a = abcdefg
+ echo abc
abc
|
~$ bash - x test.sh abcdefgkk / abcdefgh
+ a = abcdefg
+ echo h
h
|
经过一些列尝试,得到以下结论
对于${1#$a}这条语句
在#前面的数字代表着第几个参数(0号参数是脚本本身的名字)
其作用是用来和之后的a变量中的内容进行对比。
2.1 当第一个参数的内容的长度小于a字符串长度时,以第一个参数中的内容为这个变量最后的内容。
(例如:a=abcdefg, $1=aaa,$最终=aaa)
2.2 当第一个参数的内容的与a字符串长度相同时,且内容不同时,也以第一个参数中的内容为变量最后的内容
(例如:a=abcdefg, $1=sjdxkdj,$最终=sjdxkdj)
2.3 当第一个参数的长度与a字符串长度相同,且内容相同时,变量最终内容为空。
(例如:a=abcdefg, $1=abcdefg,$最终=)
2.4 当第一个参数的长度大于a字符串长度,且第一个参数中从第一个字符起,不以a内容为子集,变量会以第一个参数的内容为变量最后内容。
(例如:a=abcdefg, $1=accdefg,$最终=accdefg)
2.5 当字符串长度大于第一个参数字符串长度,且第一个参数中从第一个字符起,以a内容为子集,最终变量会得到第一个参数内容消去a中内容后的值。(例如,a=abcdefg, $1=abcdefgh,$最终=h)
这样就基本了解了这里#的使用办法。
至于最后的“/”,明显是凑字符的。
说明一下:
last_part=${1#$(dirname $1)/}
输入:./test.sh /home/breeze/ideploy/20140508090116.57/
dirname $1 --> /home/breeze/ideploy
可以推断出
$(dirname $1)/ --> /home/breeze/ideploy/
然后根据上面的规则
/home/breeze/ideploy/ 与 /home/breeze/ideploy/20140508090116.57/ 用#处理,
得到的自然就是20140508090116.57/