如何在zsh中创建一个通用函数来查找目录中的随机文件?

时间:2014-07-24 22:51:33

标签: bash shell zsh

我创建了一个zsh脚本并注意到了一些重复。这导致我尝试重构它,这引起了头痛。

我想要重构的原始内容看起来像这样:

MUSIC=($BASE_DIR/music/*.mp3)
cvlc --play-and-exit $MUSIC[$RANDOM%$#MUSIC+1] &

这很简单,我拿一个目录找到所有的mp3。然后我选择随机播放cvlc。

现在从列表中选择一个随机文件似乎很有用,所以我尝试创建一个帮助函数,因为我需要做两次。我的第一次尝试看起来像这样:

random () {
        echo "$@"[$RANDOM%$#+1]
}

我回应只是检查一切,我会称之为:

random $MUSIC

现在导致:

no matches found: ./music/my_last_song_in_the_list.mp3[5647%12+1]

然后我尝试了其他几件事:

random () {
        #echo "$@"
        echo $1
        echo $*
        echo "$*"
        echo $@
        echo "$@"
        echo $#

        ITEMS="$@"
        NUM=$#

        echo $ITEM
        echo $NUM
        echo $#ITEMS

        echo $[$NUM+1]
        echo $ITEMS[$RANDOM%$NUM+1]

        echo "$@"[$RANDOM%$#+1]
}

现在我最接近的是将$ITEMS设为"$@"(我假设这是this article给出的最佳结果,我也尝试过其中每一个$#ITEMS您可以看到的集合如上所述。会发生什么事情,我从名称中得到一个单独的字符,{{1}}是整个字符串的长度。

有没有人有解决方案如何在zsh脚本中获取并将多个参数传递给本地函数?

提前致谢。

1 个答案:

答案 0 :(得分:1)

function randomArgument {
      # -L make any option changes local to the function
      # -R all setable options are set to their default values.
      # thus using this makes sure the function will work the same way
      # regardless of their settings. Not really necessary here... but
      # good practice.
      emulate -RL zsh
      if [[ $# -eq 0 ]]; then return 0; fi
      local rr # local so as not to leak the variable to the shell
      # $(( )) is the way to do arithmetic in Zsh
      rr=$(( 1 + $RANDOM % $# ))
      echo $@[${rr}]
}