.md
这是一个简化的代码,如果它包含与父目录和扩展名相同的文件名,则打印目录的名称。
FIND(){
find . -type d -exec sh -c '
for d do
[ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND
概括地说,我想将搜索词${d}/${d##*/}.md
作为参数发送给FIND
函数,但不幸的是,这不会输出任何内容:
FIND(){
local SearchTerm="${1}"
find . -type d -exec sh -c '
for d do
[ -f "${SearchTerm}" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND '${d}/${d##*/}.md'
我确信 . 的引用存在一些问题SearchTerm
。有什么提示吗?
我试过了:FIND '\${d}/\${d##*/}.md'
但没有输出
"${SearchTerm}"
需要在外部进行sh -c '
推断,如下所示:为了解释更多,我们可以运行一个小测试:
'Before "$SearchTerm" After'
是没有任何参数扩展的单个字符串,因为它都在单引号中。'Before "'"$SearchTerm"'" After'
实际上是三个字符串连接在一起:'Before "'
# 最后,它是一个双引号,后跟一个单引号"$SearchTerm"
# 参数扩展发生在这里。'" After'
# 开头是单引号,后跟双引号希望它更清楚。
您调用的内联脚本是单引号(应该如此)。这意味着
sh -c
shell 将获得一个"${SearchTerm}"
未扩展的脚本。由于该外壳没有SearchTerm
变量,因此其值为空。由于您使用bash标记了您的问题,因此您可以传递导出函数的名称:
代码中的
testfunc=${1:-:}
将分配$1
给testfunc
它是否可用且不为空,否则,它将:
用作测试(返回 true 的无操作实用程序)。一些能够运行任意 shell 代码的替代方法,而不仅仅是
[ -f "$d/${d##*/}.md" ]
:将 shell 代码作为第一个参数传递并用于
eval
解释它:与环境变量相同
如果要解释的 shell 代码总是
[ -f "something" ]
:请注意,如果使用
zsh
,您可以只使用其e
glob 限定符来进一步限定目录 (/
) 与任意 shelle
xpression:或者有一个功能:
(
N
fornullglob
,D
fordotglob
不忽略隐藏文件和目录)