zsh offset mystery:$ {1:0:1} == $ {1:1:1}

时间:2011-12-20 18:27:39

标签: zsh

这让我感到很沮丧:

function x
{
    echo "/${1:0:1}/${1:1:1}/${1:2:1}/${1:3:1}/${1:4:1}/${1:5:1}/"
}

$ x 123456
zsh中的

打印:

/1/1/2/3/4/5/

用bash打印:

/1/2/3/4/5/6/

我读过的所有内容都说zsh使用零偏移量,就像bash一样,那么地球上的${1:0:1} = ${1:1:1}怎么样呢?

3 个答案:

答案 0 :(得分:1)

${name:offset}${name:offset:length}中的偏移始终从0开始,无论ksh_array选项的值如何(与$name[offset]不同)。但是有一个例外,即documented

  

为了与其他shell进一步兼容,有一个特殊情况,即数组偏移量为0.这通常会访问数组的第一个元素。但是,如果替换是指位置参数数组,例如, $@$*,则偏移0代替$0,偏移1代表$1,依此类推。换句话说,通过预先$0来有效地扩展位置参数数组。因此,${*:0:1}会替换$0${*:1:1}替代$1

看起来个别位置参数也会受到此异常的影响:

zsh -c 'x=abcdef; set ABCDEF; echo ${1:1:1} ${x:1:1}'
A b

这看起来像一个错误,因为限制只对位置参数数组有意义。谢谢reporting it;有一个patch应该包含在4.3.16中。

答案 1 :(得分:0)

  

我读过的所有内容都说zsh使用零偏移量,就像bash一样,所以地球上如何可以$ {1:0:1} == $ {1:1:1} ??

除非您设置ksharrays,否则不成立。即使在这种情况下,${1:0:1}也会保留其行为,但此选项仅适用于${array[subscript]}/${a[s1,s2]}表单,而不适用于${array:subscript}/${a:s:l}表单。 man zshexpn中的«PARAMETER EXPANSION»部分描述了这种形式的处理。表格${a[s1,s2]}man zshparam中的«ARRAY PARAMETERS»部分进行了描述。

答案 2 :(得分:0)

function z
{
  var=$1
  echo "var:/${1:0:1}/${1:1:1}/${1:2:1}/"
  echo "var:/${var:0:1}/${var:1:1}/${var:2:1}/"
}

$ z abcde

var:/ a / a / b /

var:/ a / b / c /