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

时间:2013-06-08 02:15:36

标签: 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

但是为了“正确”,我怎样才能合理地对只有第一个非空白(或非空白)行进行grep?

2 个答案:

答案 0 :(得分:3)

使用find:

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

答案 1 :(得分:2)

GNU awk

awk '
FNR==1 && $0~/#!\/bin\/sh|#!\/usr\/bin\/env sh|#!\/usr\/bin\/env bash|#!\/bin\/bash/ { 
    print FILENAME " is shell script";
}
FNR>1 {
    nextfile
}' *
  • 您可以使用上述regex并将其缩小为#!
  • FNR==1以及regex将确保检查she-bang行的第一行。
  • nextfile将确保不会在第一行之外查找任何文件。
  • print仅用于记录。
  • FILENAME将打印受检查文件的名称。
  • *将对工作目录下的所有文件进行全局处理。