鉴于:
myvar=Hello
echo $myvar
- >显示Hello
(目前为止罚款)echo $myvar#world
- >显示Hello#world
(为什么?我认为它会抱怨这里没有名为myvar#world
的变量echo ${myvar#world}
- >仅显示Hello
(再次,为什么?)答案 0 :(得分:26)
第二种情况分为三部分:
[echo] [$myvar][#world]
1 2 3
第1部分是命令,第2部分是参数,第3部分是字符串文字。参数在r
上停止,因为#
不能是变量名的一部分(变量名中不允许使用#。)
shell解析器将通过$
识别参数名称的开头,并以任何不能成为变量名称一部分的字符结束。通常,变量名中只允许使用字母,数字和下划线,其他任何内容都会告诉shell您已完成指定变量的名称。
所有这些都会打印出$myvar
后跟六个文字字符:
echo $myvar world
echo $myvar?world
echo $myvar#world
如果要在参数后面直接放置可以作为参数一部分的字符,可以在参数名称周围加上大括号,如下所示:
myvar=hello
echo ${myvar}world
打印出来:
helloworld
你的第三个案例是substring removal,但没有匹配。为了让它做一些有趣的事情,请尝试这样做:
myvar="Hello World"
echo ${myvar#Hello }
只打印World
。
答案 1 :(得分:6)
变量不能包含“#”,因此shell知道它不是变量的一部分。
构造$ {myvar#world}实际上是一个字符串操纵器,如下所述:
#实际上是一个字符串修饰符,它将删除与“world”匹配的字符串的第一部分。由于myvar中没有字符串匹配的世界只是回声“你好”