Bash 如何仅从文件集合中选择shell脚本

Bash 如何仅从文件集合中选择shell脚本,bash,shell,unix,grep,Bash,Shell,Unix,Grep,我想找到我现在积累的所有bash脚本,并通过bash-n自动运行它们 做这件事的快捷方法是什么?我希望grep只匹配第一个非空行以开头的文件/bin/sh或/usr/bin/env sh或/usr/bin/env bash或/bin/bash 一个有用的答案当然是类似于 for file in *; do if head -n 5 $file | grep "#!.*sh$" > /dev/null; then bash -n $file fi done

我想找到我现在积累的所有bash脚本,并通过bash-n自动运行它们

做这件事的快捷方法是什么?我希望grep只匹配第一个非空行以开头的文件/bin/sh或/usr/bin/env sh或/usr/bin/env bash或/bin/bash

一个有用的答案当然是类似于

for file in *; do 
    if head -n 5 $file | grep "#!.*sh$" > /dev/null; then
        bash -n $file
    fi
done
但是为了正确起见,我应该如何合理地只对第一个非空白行或非空白行执行grep呢

使用GNU awk

您可以使用上面的正则表达式,并将其简化为!。 FNR==1以及正则表达式将确保检查第一行的she-bang行。 nextfile将确保在第一行之外不会查看任何文件。 如果只是为了记录而打印。 FILENAME将打印被检查文件的名称。 *将全局定位到工作目录下的所有文件。 使用查找:

     find . -type f -exec grep -e "^#\!\/bin\/.*sh$" {} +

file命令将比grep更好地告诉您某个东西是否是shell脚本。我可以告诉您,bash-n对一组脚本所能提供的有限检查是如此之弱,以至于毫无用处;大多数解释语言都很难实现?通过静态分析提供更多信息。我会尽我所能,如果它知道一个明显的语法错误,它对我很有帮助。我会查档案的,谢谢没有理由去查“第一个非空行”。这个“shebang”必须是文件第一行的第一个字符。因此,查看文件的第一行就足够了。@robmayoff啊,谢谢。我不知道。但是现在我想知道怎么做,我必须知道。@msw你应该发布file命令的推荐作为答案。@StevenLu awk唯一让人害怕的是名字:只有在第一行匹配时才会调用nextfile。@jaypal,确定吗?我认为那样会更有效率将尽可能多地将每个文件传递给grep。\;相反,将为每个单独的文件调用grep。是的,+是有效的,因为OP提到他有很多文件,使用+将批量传递文件名,其中为{}\;将一次传递一个文件。我投票赞成你的答案!:
     find . -type f -exec grep -e "^#\!\/bin\/.*sh$" {} +