首先,请注意,当您这样说时:
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)
不是参数的允许可能性之一。
至于在一个作业中执行此操作的方法,请使用其他响应中提到的其他命令的管道。