我在 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
,则不替换任何内容(即让 find 执行它是正常的递归行为)。
看起来可能有点奇怪,因为虽然这只是${name:-word}
形式,但word
实际上以连字符开头。(在此处查看更多信息http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion)
相反,发生的事情是,如果recurse
为空,它会替换"-maxdepth 1"
(注意周围的引号),如果recurse
设置,它会替换""
.
不递归时的确切错误是 find: unknown predicate `-maxdepth 1'
. 例如,您可以自己尝试一下find "-maxdepth 1"
。当我们确实想要递归时,发生了一些奇怪的事情,我无法解释,但错误是find `t': No such file or directory
.
有谁知道如何让 zsh 在这个参数扩展中不加引号?我相信这是我的问题。
谢谢。