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