您尚未登录。

#1 2014-09-17 23:28:53

尹良灿
会员
注册时间: 2013-04-23
帖子: 178

关于 $* 的问题

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.

这是为什么呢?

离线

#2 2014-09-17 23:36:33

尹良灿
会员
注册时间: 2013-04-23
帖子: 178

Re: 关于 $* 的问题

发现只要是多个参数时就会这样,添加任务 't ad xxxxxxxxxxx' 或者 't lsa -p' 什么的都会

离线

#3 2014-09-17 23:43:53

尹良灿
会员
注册时间: 2013-04-23
帖子: 178

Re: 关于 $* 的问题

晕了。。改用 $@ 就变得可用了,可是会提示 ”todo.sh:[:1: too many arguments“

离线

#4 2014-09-18 10:29:55

依云
a.k.a. 百合仙子
所在地: 一个等待妹纸出现的地方
注册时间: 2011-08-21
帖子: 4,388
个人网站

Re: 关于 $* 的问题

判断是否有参数用 $# 啊。另外用 [[ ]] 嘛。zsh 不是 bash。

离线

#5 2014-09-18 10:49:49

尹良灿
会员
注册时间: 2013-04-23
帖子: 178

Re: 关于 $* 的问题

百合仙子 说:

判断是否有参数用 $# 啊。另外用 [[ ]] 嘛。zsh 不是 bash。

3q~ 写成这样就没有出错了

todo.sh() {
    if (( ! $# )); then
        /usr/bin/todo.sh ls
    else
        /usr/bin/todo.sh $@
    fi
}
alias t='todo.sh'

虽然还是不明白神马原因╮( ̄▽ ̄")╭

离线

#6 2014-09-18 17:03:14

lijing48301243
会员
注册时间: 2013-04-14
帖子: 126

Re: 关于 $* 的问题

$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 [所有参数一行]
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。[每一参数一行]

你的shell怎么倒了,不懂……


archlinux磨合中

离线

#7 2014-09-18 17:06:07

lijing48301243
会员
注册时间: 2013-04-14
帖子: 126

Re: 关于 $* 的问题

不知道zsh如何调试, bash用-x


archlinux磨合中

离线

#8 2014-09-18 17:31:19

依云
a.k.a. 百合仙子
所在地: 一个等待妹纸出现的地方
注册时间: 2011-08-21
帖子: 4,388
个人网站

Re: 关于 $* 的问题

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)

离线

#9 2014-09-18 18:40:38

尹良灿
会员
注册时间: 2013-04-23
帖子: 178

Re: 关于 $* 的问题

lijing48301243 说:

$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 [所有参数一行]
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。[每一参数一行]

你的shell怎么倒了,不懂……

那按你说的不就对了么,用 "$*" 的时候多个参数被转成了一个字符串,所以会出错。。。。

离线

页脚