-path 或 -iregex find 选项的字符串变量中不能有空格。
该输入'/home/demo.*/\.config/File System/.*t$'
被馈送到:
read i
m="-iregex $i"
find ~ $m
如果是常量而不是变量,则不会起作用,所以也不
是 ,正确的解决方案是怎样的?find ~ \'$m\'
eval find ~ \'$m\'
答案1
不要将操作放入包含数据的字符串变量中(请参阅Bash 常见问题解答 50)。使用变量时始终用双引号引起来
i='/home/demo.*/\.config/File System/.*t$'
find ~ -iregex "$i"
如果您想包含-iregex
唯一的 if$i
不为空,那么您可以执行类似的操作,保留它但将正则表达式替换为.*
(即任何内容)
find ~ -iregex "${i-.*}"
如果您使用的是诸如bash
(但不是sh
)之类的能够理解数组的 shell,则可以使用一个 shell 来-iregex
仅在需要时包含
IFS= read -r i
findRegex=()
[[ -n "$i" ]] && findRegex=('-iregex' "$i")
find ~ "${findRegex[@]}"
要查看这里发生了什么,您可以修改find
为echo find
.阅读man bash
和搜索Arrays
and/or@
也可能有帮助。
请注意,我还将您的更改read i
为IFS= read -r i
.这会阻止 shell 尝试解析您的输入数据,这可能会破坏包含多个空格($IFS
准确地说是字符)和其他字符组合的表达式