func() {
local x
x=${1:3:1}
...
}
< p >“x = $ {1:3:1}”是什么意思?我知道“$ 1”,“$ 2”和“$ 3”是函数的参数。那么上述语句是否表示“x = $ 1:$ 2:$ 3”?< / p> 这个语句中的“${1:3:1}”是一种bash shell变量扩展形式,其中“1”是指参数位置,“3”是指从第三个字符开始截取,而“1”则表示截取一个字符。因此,该语句的含义是将函数的第一个参数的第三个字符赋值给变量“x”。
func() {
local x
x=${1:3:1}
...
}
< p >“x = $ {1:3:1}”是什么意思?我知道“$ 1”,“$ 2”和“$ 3”是函数的参数。那么上述语句是否表示“x = $ 1:$ 2:$ 3”?< / p> 这是一个GNU shell参数扩展,以${
开始的其中之一。
像${parameter:-word}
、${parameter:=word}
、${parameter:?word}
、${parameter:+word}
和其他几个。
这个(仅适用于ksh
,bash
和zsh
):${parameter:offset:length}
从偏移量开始提取长度字符(可选;如果省略,则提取参数中剩余的字符串)。具体细节在Bash手册中有描述。
${name:offset:length}
子字符串展开。从偏移量指定的字符开始,将参数的值扩展到长度为length的字符。如果参数是@,由@或*索引的索引数组,或关联数组名称,则结果如下所述有所不同。如果省略长度,则展开为从偏移量指定的字符开始并延伸到值的末尾的参数值的子字符串。长度和偏移量是算术表达式(请参阅下面的算术评估)。
如果偏移量计算出小于零的数字,则该值用作参数值结尾处的字符偏移量。如果长度计算出小于零的数字,则它被解释为相对于参数值结尾处的字符偏移量而不是字符数,并且展开是偏移量和该结果之间的字符。注意,负偏移必须与冒号分隔至少一个空格,以避免与:-展开混淆。
如果参数是@,则结果是从偏移量开始的长度位置参数。负偏移相对于最大位置参数加1进行处理,因此偏移量为-1时计算为最后一个位置参数。如果长度计算出小于零的数字,则为扩展错误。
如果参数是由@或*下标的索引数组名称,则结果是从${parameter[offset]}开始的数组的length个成员。负偏移相对于指定数组的最大索引加1进行处理。如果长度计算出小于零的数字,则为扩展错误。
应用于关联数组的子字符串扩展产生未定义的结果。
子字符串索引从零开始,除非使用位置参数,在这种情况下,默认情况下从1开始索引。如果偏移量为0,并且使用了位置参数,则在列表中添加$0。
使用手册页面,所有信息都在那里。 man bash
:
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of the
value of parameter starting at the character specified by off‐
set. If parameter is @, an indexed array subscripted by @ or *,
or an associative array name, the results differ as described
below. If length is omitted, expands to the substring of the
value of parameter starting at the character specified by offset
and extending to the end of the value. length and offset are
arithmetic expressions (see ARITHMETIC EVALUATION below).
x=${1:3:1}是什么意思?
这是子字符串截取,英文为:使用字符串$1
,从索引3
(索引从0开始)开始,取出1
个字符。因此,如果$1 === "foobar"
,那么${1:3:1} === "b"
。
我知道$1、$2和$3是函数的参数。那么上面的语句是否意味着x=$1:$2:$3?
不是,相邻的变量表示字符串连接:将$1
、$2
和$3
中的字符串连接起来,得到x="$1$2$3"
。
另外,如果有人能够建议如何在谷歌搜索特殊字符,那真的很有帮助。有标准关键词吗?我尝试搜索“shell脚本中的冒号是什么”,但搜索结果很随意。
bash参数替换
通常可以让你接近答案。我知道我无法记住bash可以操纵数据的所有不同语法方式,因此将"参数替换"牢记于心会有所回报。字符串操作恰好在参数替换之前的章节中介绍。
试试这个:
set ABCDEFG
echo ${1:3:1}
它是获取一个子字符串。通常情况下,${} 指的是数组变量(在本例中是字符数组)。
if [ adb = bash ]; then echo "Yes, it is";else echo "No, it's different";fi
- Ipor Sircer