如何将 shell 通配符传递到反引号命令中
我试图在 shell 脚本中使用 find 来计算与通配符模式匹配的文件数,然后获取文件名(如果只有一个)。但我在将通配符模式传递到反引号扩展时遇到问题。
FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)
if [ $DATACOUNT -eq 1 ]
then
use-data $($FINDCMD)
else
echo bugger
fi
这是行不通的:shell 在调用 find 时扩展DATA.txt。我希望通过星号来查找。
如果我成功了
FINDCMD="find . -iname '*DATA*.txt'"
,那么 shell 不会扩展星号,但 find 会得到单引号并且不匹配任何内容。
I am trying to use find in a shell script to count the number of files I have matching a wildcard pattern, then to get the name of the file if there is only one. But I'm having trouble passing the wildcard pattern through to backtick expansion.
FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)
if [ $DATACOUNT -eq 1 ]
then
use-data $($FINDCMD)
else
echo bugger
fi
That doesn't work: the shell expands DATA.txt at the time of calling find. I want the asterisks to be passed to find.
If I make it
FINDCMD="find . -iname '*DATA*.txt'"
Then the shell doesn't expand the asteriks, but find gets the single-quotes and matches nothing.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不要将命令放入变量中。直接执行命令有什么问题吗?
编辑:
如果您想重用该命令,请使用子例程
Don't put your commands in a variable. What's wrong with just executing the command directly?
Edit:
if you wan to reuse the command, use a subroutine
执行以下两项操作:
FINDCMD="find . -iname \"*DATA*.txt\""
或FINDCMD='find . -iname "*DATA*.txt"'
-f 禁用路径名扩展。
如下set -f
在脚本开头那应该可以解决问题。虽然没有在您的脚本上进行测试,但您应该从这一点得到这个想法。
Do BOTH of following:
FINDCMD="find . -iname \"*DATA*.txt\""
ORFINDCMD='find . -iname "*DATA*.txt"'
-f Disable pathname expansion.
as followsset -f
in the beginning of the scriptThat should do the trick. Not tested on your script though, but you should get the idea from this point.
交换单引号和双引号。
尝试:
Switch the single and double quotes.
Try: