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

时间:2010-08-16 20:50:02

标签: bash scripting

鉴于:

myvar=Hello
  • echo $myvar - >显示Hello(目前为止罚款)
  • echo $myvar#world - >显示Hello#world(为什么?我认为它会抱怨这里没有名为myvar#world的变量
  • echo ${myvar#world} - >仅显示Hello(再次,为什么?)

2 个答案:

答案 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中没有字符串匹配的世界只是回声“你好”