2010-06-01 52 views
2

由于某种原因,这个脚本可以在最后使用所有'echo',但是没有它们,$ wall是一个空字符串。这似乎很奇怪的行为。zsh回声的副作用?

#!/bin/zsh 

if [ ! -n "$1" ] ; then 
    files=(~/pictures/backgrounds/*jpg) 
else 
    while [ $1 ] ; do 
     files+=(`echo $1/*jpg`) 
     shift 
    done 
fi 
echo $files 
N=${#files} 
echo $N 
((N=RANDOM%N)) 
echo $N 
wall=${files[$N]} 
echo $wall 
cp $wall ~/wall.jpg 
+0

如果将N硬编码为1并删除回显会发生什么?同样的问题?换句话说,你能以这种方式失败的最短代码是什么? – barrycarter 2010-06-02 00:33:45

回答

4

该代码有时会失败,因为RANDOM%N会导致零和的zsh数组索引以1开始,您应该使用RANDOM%N+1来代替。

+0

该位最初是在bash中。所以回声与它无关? – 2ck 2010-06-03 03:19:15

1

您可以:

setopt ksharrays 

,使从零开始的索引。

man zshoptions

仿效ksh的阵列尽可能接近处理成为可能。如果设置此 选项,则数组元素从0开始编号,数组 参数无下标指的是整个数组的第一个元素,而不是 ,并且需要使用大括号来分隔子 脚本(${path[2]}' rather than just $ path [2] “)。