给出了一个有创意的例子
FOO="/foo/bar/baz"
这个工程(在bash中)
BAR=$(basename $FOO) # result is BAR="baz" BAZ=${BAR:0:1} # result is BAZ="b"
这不是
BAZ=${$(basename $FOO):0:1} # result is bad substitution
我的问题是哪个规则导致这个[subshell替代]错误地评估?如果有的话,在1跳中做什么是正确的方法?
首先,请注意,当你这样说:
BAR=$(basename $FOO) # result is BAR="baz" BAZ=${BAR:0:1} # result is BAZ="b"
BAZ的构造中的第一个位是BAR,而不是要采用第一个字符的值.所以即使bash允许变量名包含任意字符,你的第二个表达式的结果也不会是你想要的.
但是,关于阻止这一点的规则,请允许我从bash手册页引用:
DEFINITIONS The following definitions are used throughout the rest of this docu‐ ment. blank A space or tab. word A sequence of characters considered as a single unit by the shell. Also known as a token. name A word consisting only of alphanumeric characters and under‐ scores,and beginning with an alphabetic character or an under‐ score. Also referred to as an identifier.
然后稍后
PARAMETERS A parameter is an entity that stores values. It can be a name,a num‐ ber,or one of the special characters listed below under Special Param‐ eters. A variable is a parameter denoted by a name. A variable has a value and zero or more attributes. Attributes are assigned using the declare builtin command (see declare below in SHELL BUILTIN COMMANDS).
之后当它定义你所要求的语法时:
${parameter:offset:length} Substring Expansion. Expands to up to length characters of parameter starting at the character specified by offset.
因此,在联机帮助页中阐述的规则表示${foo:x:y}构造必须具有参数作为第一部分,并且参数只能是名称,数字或少数特殊参数字符之一. $(basename $FOO)不是参数允许的可能性之一.
对于在一个作业中执行此操作的方式,请使用管道到其他响应中提到的其他命令.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。