4

我想找到我所有的 bash 脚本(我现在已经积累了很多)并自动运行它们bash -n

有什么快速的方法来做到这一点?我只想匹配第一个非空行以or或orgrep开头的文件...#!/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?

4

2 回答 2

3

使用查找:

     find . -type f -exec grep -e "^#\!\/bin\/.*sh$" {} +
于 2013-06-08T03:28:54.927 回答
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将打印正在检查的文件的名称。
  • *将 glob 到工作目录下的所有文件。
于 2013-06-08T02:35:59.250 回答