bash如何知道变量名称的结束位置?

sun*_*107 21 bash scripting

鉴于:

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.


enn*_*ler 6

变量不能包含"#",因此shell知道它不是变量的一部分.

构造$ {myvar#world}实际上是一个字符串操纵器,如下所述:

#实际上是一个字符串修饰符,它将删除与"world"匹配的字符串的第一部分.由于myvar中没有字符串匹配的世界只是回声"你好"