在bash

时间:2015-05-12 17:02:57

标签: linux bash shell

有人知道bash中${1:1}的含义吗?

例如:

for (( i=0; $i < ${1:1}; i++ ))
do
    addToList $2
done

2 个答案:

答案 0 :(得分:4)

这是一个bash parameter expansion

具体做法是:

${parameter:offset}
${parameter:offset:length}
     

这称为子字符串扩展。它扩展为从offset指定的字符开始的参数值的最大长度字符。如果参数是'@',由'@'或'*'下标的索引数组或关联数组名称,结果将如下所述不同。如果省略length,它将扩展为参数值的子字符串,该值从offset指定的字符开始并延伸到值的末尾。 length和offset是算术表达式(参见Shell Arithmetic)。

     

以下是一些说明参数和下标数组的子字符串扩展的示例:

$ string=01234567890abcdefgh
$ echo ${string:7}
7890abcdefgh

所以${1:1}从第二个字符(1 1未指定offset)开始展开位置参数length的子字符串。

据推测,这是为了支持一个带有这样的参数的脚本:

./addn -10 A

将10个A元素添加到addToList正在添加的内容中。

虽然这种处理方式很糟糕,除非在此之前已经检查了论证的有效性/理智性。

答案 1 :(得分:1)

亲眼看看:

#!/bin/bash
for (( i=0; $i < ${1:1}; i++ ))
do
    echo $i ${1:1}
done

将其保存到名为 test 的文件中。现在运行这样的测试:

./test 45

您将获得输出:

0 5
1 5
2 5
3 5
4 5

稍微解释发生了什么:

您正在使用算术循环,因此它需要算术值${1:1},它实际上是您的参数45的第二个数字。

$(1:1}只接受来自命令行传递的第一个参数的索引1的字符串,现在为5。如果你传递a5作为参数,输出仍然是相同的。因此$i从0到4循环5次。

因此,如果您使用${2:1},则需要第二个参数,即您必须运行测试,如:./test 34 455

这次它将从第二个参数获取值55,在这种情况下是索引1的字符串。