有人知道bash中${1:1}
的含义吗?
例如:
for (( i=0; $i < ${1:1}; i++ ))
do
addToList $2
done
答案 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的字符串。