我正在查看下面显示的代码,它会检查输入是否行/列参数以-r
or开头-c
。${1:0:2}
在这种情况下意味着什么?
rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
echo $correctCmdMsg >&2
exit 1
fi
答案1
它是 shell 的子字符串扩展(参数扩展的子类)模式。
格式为:
${parameter:offset:length}
并且索引从 0 开始。
假设您有一个变量foo
,然后${foo:0:2}
生成前两个字符(从位置 0 到下一个 2)。
例子:
$ foo=spamegg
$ echo "${foo:0:2}"
sp
在您的情况下,第一个数字1
指的是变量 name $1
,它是通过命令行(在主程序中)传递的第一个参数或传递给函数的第一个参数。
所以在你的情况下,"${1:0:2}"
将:
开始提取从索引 0 开始的子字符串,即第一个字符
并继续下两个字符
因此,在操作之后,您将获得输入字符串的前两个字符(索引为 0 和 1)。
和[ "${1:0:2}" != $rowArgName ]
正在[ "${1:0:2}" != $colArgName ]
检查输出子字符串是否等于其他一些字符串。
答案2
摘录自man bash
:
${参数:偏移量:长度}
子串扩展。扩展到从 指定的字符开始
length
的值的 最多字符。如果参数是、下标为或 的索引数组或关联数组名称,则结果会有所不同,如下所述。如果省略,则扩展为从由 指定的字符开始 并延伸到该值的末尾的 值的子字符串。 和 是算术表达式(请参阅下面的算术评估)。parameter
offset
@
@
*
length
parameter
offset
length
offset
答案3
这是从变量中提取简单的子字符串。有问题的变量是脚本的第一个参数(即1
)。
如果我有一个变量 FOO,我可以用 看到它的值的前两个字符${FOO:0:2}
。在您的示例中,第一个参数也做了同样的事情。