在Bash中,"${var:x:y}"是什么意思?

3
在shell脚本的函数内部,我看到了类似于这样的代码。
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”。
5个回答

5
这被称为shell中的参数扩展。 ${PARAMETER:OFFSET:LENGTH}可以仅展开参数值的一部分,给定起始位置和长度(可能省略)。如果省略了LENGTH,则参数将扩展到字符串的末尾。如果LENGTH是负数,则作为第二个偏移量从字符串末尾开始计数。
OFFSET和LENGTH可以是任何算术表达式。 OFFSET从0开始,而不是1。
例如,假设参数是一个字符串,MYSTRING="Be liberal in what you accept, and conservative in what you send",那么echo ${MYSTRING:34:13}将返回conservative,因为它会从第33个字符(索引从0开始)“c”开始计数,并计算13个字符的长度。
所以在你的情况下,$1是你传递给脚本的参数,然后它偏移该参数的3个字符并取一个长度为1的字符串并将其初始化为x。
更多内容请查看此处:http://wiki.bash-hackers.org/syntax/pe#substring_expansion

4

这是一个GNU shell参数扩展,以${开始的其中之一。

${parameter:-word}${parameter:=word}${parameter:?word}${parameter:+word}和其他几个。

这个(仅适用于kshbashzsh):${parameter:offset:length}从偏移量开始提取长度字符(可选;如果省略,则提取参数中剩余的字符串)。具体细节在Bash手册中有描述。

${name:offset:length}

子字符串展开。从偏移量指定的字符开始,将参数的值扩展到长度为length的字符。如果参数是@,由@或*索引的索引数组,或关联数组名称,则结果如下所述有所不同。如果省略长度,则展开为从偏移量指定的字符开始并延伸到值的末尾的参数值的子字符串。长度和偏移量是算术表达式(请参阅下面的算术评估)。

如果偏移量计算出小于零的数字,则该值用作参数值结尾处的字符偏移量。如果长度计算出小于零的数字,则它被解释为相对于参数值结尾处的字符偏移量而不是字符数,并且展开是偏移量和该结果之间的字符。注意,负偏移必须与冒号分隔至少一个空格,以避免与:-展开混淆。

如果参数是@,则结果是从偏移量开始的长度位置参数。负偏移相对于最大位置参数加1进行处理,因此偏移量为-1时计算为最后一个位置参数。如果长度计算出小于零的数字,则为扩展错误。

如果参数是由@或*下标的索引数组名称,则结果是从${parameter[offset]}开始的数组的length个成员。负偏移相对于指定数组的最大索引加1进行处理。如果长度计算出小于零的数字,则为扩展错误。

应用于关联数组的子字符串扩展产生未定义的结果。

子字符串索引从零开始,除非使用位置参数,在这种情况下,默认情况下从1开始索引。如果偏移量为0,并且使用了位置参数,则在列表中添加$0。


1

使用手册页面,所有信息都在那里。 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).

谢谢。顺便说一下,我正在使用adb shell。adb shell是bash吗? - Sandeep
1
if [ adb = bash ]; then echo "Yes, it is";else echo "No, it's different";fi - Ipor Sircer
它说不一样。但我尝试打印$adb。它是空的。这是检查的正确方式吗? - Sandeep

1

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可以操纵数据的所有不同语法方式,因此将"参数替换"牢记于心会有所回报。字符串操作恰好在参数替换之前的章节中介绍。


0

试试这个:

set ABCDEFG

echo ${1:3:1}

它是获取一个子字符串。通常情况下,${} 指的是数组变量(在本例中是字符数组)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接