我正在使用 zsh,我有这个功能:
function timer-raw() {
# Just think `loop fsayd` is `echo hi` for the purposes of this question.
eval "sleep $((($1)*60))" && eval ${(q+@)@[2,-1]:-loop fsayd}
}
timer-raw
的第一个参数告诉它要等待多少分钟;其余参数(如果存在)将eval
在等待之后像在命令行上键入一样被编辑:
timer 3 echo sth
# After 3 minutes, echoes `sth`.
但是,如果没有提供更多参数,我希望它运行默认命令loop fsayd
:
timer 4
# runs `loop fsayd` after 4 minutes
问题是我想loop fsayd
被替换为两个词,但我不知道如何。我也尝试了这些变化,但它们也不起作用:
"${(q+@)${@[2,-1]:-loop fsayd}}"
"${(q@)${(q@)=@[2,-1]:-loop fsayd}}"
"${(qq@)=@[2,-1]:-loop fsayd}"
通过“不起作用”,我的意思是简单的timer 0
会失败 a command not found
,或者timer 0 ff hi 'man hi jk k'
无法返回正确数量的输入参数。( ff() echo "$#"
)
注意:我不想使用test -z "${@[2,-1]}"
.
如果可以在变量中定义默认值,您应该能够:
就我个人而言,我不会使用 eval 而只是这样做:
大声笑我想通了:
这将替换 (
${name/pattern/repl}
) 名为 "" (nothing) 的不存在变量的内容 - 这是一个空字符串 - 用循环 fsayd 替换 (空) 字符串 (pattern#
) 的开头,同时进行分词 (options(z)
) ..... :D