我创建了一个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脚本中获取并将多个参数传递给本地函数?
提前致谢。
答案 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}]
}