给 todo.txt 写了个 wrapper 函数
todo.sh() {
if [ -z "$*" ]
then
/usr/bin/todo.sh ls
else
/usr/bin/todo.sh "$*"
fi
}
alias t='todo.sh'
之所以这样写因为想用 zsh 补全。
然后 "t help","t lsa"这些命令都没有问题,想用 "t add" 添加 task 时就会失败,情况跟输入了不支持的命令一样,显示
Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
Try 'todo.sh -h' for more information.
这是为什么呢?
离线
发现只要是多个参数时就会这样,添加任务 't ad xxxxxxxxxxx' 或者 't lsa -p' 什么的都会
离线
晕了。。改用 $@ 就变得可用了,可是会提示 ”todo.sh:[:1: too many arguments“
离线
判断是否有参数用 $# 啊。另外用 [[ ]] 嘛。zsh 不是 bash。
离线
判断是否有参数用 $# 啊。另外用 [[ ]] 嘛。zsh 不是 bash。
3q~ 写成这样就没有出错了
todo.sh() {
if (( ! $# )); then
/usr/bin/todo.sh ls
else
/usr/bin/todo.sh $@
fi
}
alias t='todo.sh'
虽然还是不明白神马原因╮( ̄▽ ̄")╭
离线
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 [所有参数一行]
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。[每一参数一行]
你的shell怎么倒了,不懂……
archlinux磨合中
离线
不知道zsh如何调试, bash用-x
archlinux磨合中
离线
zsh 也是用 -x。
在 zsh 里(默认情况):$* 是所有参数构成的数组,$@ 等同于 $argv[@] (如果存在)即 $*[@],是所有位置参数。"$*" 把数组转成了字符串(默认没有设置 sh_word_split 所以依旧是单个参数),"$@" 适用数组下标 [@] 的特殊情况,进行参数分割(即 "$1" "$2" "$3" ...)。
在 bash 里:$* 成为一系列单独的字符串,然后生成的字符串还可能被再次分割(相当于 zsh 的 ($@ 或者 "$*") + sh_word_split)。"$*" 等同于 "$1C$2C...",其中 C 是 $IFS 中的第一个字符(相当于 zsh 里的 "$*" 或者 $@)。"$@" 等同于 "$1" "$2" ... (相当于 zsh 的 "$@")。$@ 意义未知,因为文档没有说。
注意以上所有的 " 都是 shell 里的语法而不是行文的标点符号。
参考: http://zsh.sourceforge.net/Guide/zshguide03.html#l50
最近编辑记录 依云 (2014-09-18 17:38:32)
离线
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 [所有参数一行]
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。[每一参数一行]你的shell怎么倒了,不懂……
那按你说的不就对了么,用 "$*" 的时候多个参数被转成了一个字符串,所以会出错。。。。
离线