这让我感到很沮丧:
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}
怎么样呢?
答案 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 /