zsh:参数扩展插入引号

时间:2013-04-24 19:03:41

标签: parameters quotes zsh expansion

我在zsh中的参数扩展期间遇到了麻烦:它将我的变量括在引号中。

这是我的脚本。 (对于噪音道歉,唯一真正重要的一行是find调用的最后一行,但我想确保我没有隐藏我的代码的详细信息)

    #broken_links [-r|--recursive] [<path>]
    # find links whose targets don't exist and print them. If <path> is given, look
    # at that path for the links. Otherwise, the current directory is used is used.
    # If --recursive is specified, look recursively through path.
    broken_links () {
        recurse=
        search_path=$(pwd)

        while test $# != 0
        do
                case "$1" in
                        -r|--recursive)
                                recurse=t
                                ;;
                        *)
                                if test -d "$1"
                                then
                                        search_path="$1"
                                else
                                        echo "$1 not a valid path or option"
                                        return 1
                                fi
                                ;;
                esac
                shift
        done

      find $search_path ${recurse:--maxdepth 1} -type l ! -exec test -e {} \; -print
    }

为了清楚起见,在find行中,我想这样:如果recurse为空,请替换-maxdepth 1。如果recurse设置为t,则不替换任何内容(即让我们发现它是正常的递归行为)。

看起来可能有点奇怪,因为虽然这只是${name:-word}形式,但word实际上以连字符开头。 (详情请见http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion

相反,正在发生的事情是,如果recurse为空,则替换"-maxdepth 1"(请注意周围的引号),如果设置recurse,则替换为""。< / p>

不递归时的确切错误是find: unknown predicate `-maxdepth 1'。您可以通过简单地说find "-maxdepth 1"来自行尝试。当我们想要递归时,发生了一些奇怪的事情我无法解释,但错误是find `t': No such file or directory

有谁知道如何让zsh不在这个参数扩展中放置引号?我相信这是我的问题。

感谢。

1 个答案:

答案 0 :(得分:2)

zsh实际上并没有添加引号,它只是没有说话 拆分参数扩展的结果。这是怎么回事 记录为默认行为。来自附近的zshexpn手册页 参数展开部分的开头:

Note  in  particular  the  fact that words of unquoted parameters are not 
automatically split on whitespace unless the option SH_WORD_SPLIT is set

因此,您可以通过执行setopt sh_word_split来设置该选项 拆分要对所有参数扩展完成,或者您可以显式请求 通过使用:

进行扩展
${=recurse:--maxdepth 1}

请注意=符号作为大括号内的第一个字符。这也是值得注意的 在zshexpn手册页中,搜索${=spec}