Shell 查找grep在命令行中工作,但在脚本中失败;自动脱壳?

Shell 查找grep在命令行中工作,但在脚本中失败;自动脱壳?,shell,command-line,grep,find,Shell,Command Line,Grep,Find,更新: 在再次尝试之后,结果表明脚本完全按照它应该的方式工作。我一定是太累了,做了一些愚蠢的事情,让我觉得剧本错了,而事实上是我自己-( 感谢您对切普纳、谢尔特、威廉、格伦和乔纳森的帮助,我想我的困惑实际上是由于我在当前目录上执行查找而引起的。“ 谢谢你的提示 此线程已准备好关闭 考虑以下几点: find . | grep -E ".*\.log$" 如果在命令行上运行,它将按预期工作,即 打印出以.log 但是,在脚本中,例如: #!/bin/sh find . | grep -E ".*\

更新:
在再次尝试之后,结果表明脚本完全按照它应该的方式工作。我一定是太累了,做了一些愚蠢的事情,让我觉得剧本错了,而事实上是我自己-(
感谢您对切普纳、谢尔特、威廉、格伦和乔纳森的帮助,我想我的困惑实际上是由于我在当前目录上执行查找而引起的。“
谢谢你的提示

此线程已准备好关闭

考虑以下几点:

find . | grep -E ".*\.log$"
如果在命令行上运行,它将按预期工作,即 打印出以
.log

但是,在脚本中,例如:

#!/bin/sh
find . | grep -E ".*\.log$"
当打开
set-x
进行检查时,我注意到 正则表达式.*.log$的脚本执行 (自动-??)用单引号引用,如:

\+ find .
\+ grep -E '.*\.log$'
即使我的代码包含双引号。我如何防止 这个

限制:

  • 挑战在于同时使用
    find
    grep
    ,不允许使用其他CMD
  • 同样,挑战在于使用这两种方法,而不是像某些人可能想建议的那样,仅使用
    查找
  • 进一步说明,用于
    grep
    的正则表达式比此处显示的要复杂得多(几个
    分开) RegExps),我在这里对它进行了简化,因为它会带来麻烦 已经有一个了
我已经在这上面工作了4个多小时,没有结果。我已经搜索过了 谷歌和StackOverflow,但我没有发现任何相似之处 解决方案非常简单,我只是太笨了,找不到它-(

感谢您的帮助,提前谢谢


您使用的是什么操作系统和可执行版本

你的小剧本:

#!/bin/sh
find . | grep -E ".*\.log$"

完美地(单反斜杠或双反斜杠)适用于我的Debian气喘

yba@tavas:~$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
yba@tavas:~$ grep --version
grep (GNU grep) 2.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

shell只是以规范形式回显命令。
'.*.log$'
“.*\.log$”
生成等效字符串。您所说的“失败”是什么意思?无输出?输出不正确,如果是,是什么?另外,您是否从运行
find
命令的同一目录运行脚本?是的,不要担心
.*.log$'
,这只是显示跟踪信息的标准方式。在scr中
find
命令之前添加
echo$PWD
ipt,我会告诉你,你不会在你认为自己所在的目录中开始搜索。在这种情况下,双引号所做的唯一事情就是将“\\.”变成“\.”,这就是你在-x输出中看到的(以及你想要的)。你的查找位置是“--当前目录。您的脚本是否位于正确的位置?是否需要在脚本中使用
cd
。@chepner我所说的“失败”是什么意思是的,它只是简单地打印了所有内容,而不是像我预期的那样只打印日志文件。非常感谢Jonathan,你是绝对正确的,我不知道为什么,但突然之间脚本完全按照我预期的方式运行,尽管我什么也没做。我一定是太累了,做了一些愚蠢的事情,让我觉得脚本是正确的事实上是我自己错了-(
yba@tavas:~$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
yba@tavas:~$ grep --version
grep (GNU grep) 2.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
yba@tavas:~$ ./st.sh 
./Downloads/serial_update_rev11.log
./.virt-manager/virt-manager.log
./Android/adt-bundle-linux/eclipse/configuration/org.eclipse.update/install.log
./Android/workspace/.metadata/.plugins/org.eclipse.cdt.core/.log
./Android/workspace/.metadata/.log
./ti-dvsdk_dm365-evm_4_02_00_06/xdctools_3_16_03_36/eclipse/plugins   /org.eclipse.rtsc.xdctools.product_3.16.3.36/META-INF/Make.log
./ti-dvsdk_dm365-evm_4_02_00_06/codecs-dm365_4_02_00_00/packages/ittiam/codecs/g711_dec    /hs_err_pid17410.log
./.local/share/gvfs-metadata/root-dfdae0ca.log
./.local/share/gvfs-metadata/label-AR7266WnX\x20V2_1.2-a6becf19.log
./.local/share/gvfs-metadata/home-2def37e1.log
./.local/share/gvfs-metadata/uuid-5c7747c5-81e5-4464-bae0-2c61afc73da4-7a539d2d.log
 ./.local/share/tracker/tracker-store.log
./.local/share/tracker/tracker-miner-fs.log
./.local/share/tracker/tracker-extract.log
yba@tavas:~$