在这种情况下,$ {1:0:2}是什么意思?


19

我正在查看下面显示的代码,它检查输入的行/列参数是否以-r或开头-c${1:0:2}在这种情况下是什么意思?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi

7
您应该将要使用的外壳包括在问题中。这可能是bash
拉斐尔·阿伦斯

2
这样做似乎是为了解析命令行参数。可能您会想了解getoptgetopts简化您的生活(或这样做的人的生活)。
卡洛斯·坎德罗斯

Answers:


31

这是外壳程序的子字符串扩展(参数扩展的子类)模式。

格式为:

${parameter:offset:length}

索引从0开始。

假设您有一个变量foo,然后${foo:0:2}产生前两个字符(从位置0开始到下一个2)。

例:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

在您的情况下,第一个数字1表示变量名$1,它是通过命令行(在主程序中)传递的第一个参数或传递给函数的第一个参数。

因此,在您的情况下,"${1:0:2}"将:

  • 开始从索引0开始提取子字符串,即第一个字符

  • 并继续到下两个字符

因此,在操作之后,您将获得输入字符串的前两个字符(索引为0和1)。

[ "${1:0:2}" != $rowArgName ][ "${1:0:2}" != $colArgName ]被检查,如果输出subtring等于其他一些字符串。


1
从本质上讲,它是在检查用户是否提供了$ 1 -c-r,它可能是用getopts
Sergiy Kolodyazhnyy 16-4-12

15

摘自man bash

$ {parameter:offset:length}

子串扩展。从指定的字符开始扩展到lengthparameter的最大字符offset。如果parameter为@,则使用下标@或的索引数组*或关联数组的名称,结果将有所不同,如下所述。如果length省略,则扩展到值的子字符串,该字符串parameter从由指定的字符开始,offset 并扩展到该值的末尾。 lengthoffset 是算术表达式(请参阅下面的算术评估)。


5

这是从变量中提取子字符串的简单方法。有问题的变量是脚本的第一个参数(即1)。

如果我有一个变量FOO,则可以使用看到其值的前两个字符${FOO:0:2}。在您的示例中,第一个参数正在执行相同的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.