我在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不在这个参数扩展中放置引号?我相信这是我的问题。
感谢。
答案 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}
。