在 grep 中转义 Shebang

Escaping Shebang in grep

在 shell 脚本中,我试图找出另一个文件是否是 shell 脚本。我正在通过 grepping shebang 行来做到这一点。但我的 grep 语句不起作用:

if [[ $($(cat $file) | grep '^#! /bin' | wc -l) -gt 0 ]]
then 
echo 'file is a script!'
else 
echo "no script"
fi

我总是得到错误 "bash: #!: command not found"。我尝试了几种方法来逃避 shebang,但都没有用。

也许你可以帮我解决这个问题? :)

干杯, 纳尔夫

我建议您将条件更改为:

if grep -q '^#! */bin' "$file"

grep 的 -q 选项在这种情况下很有用,因为它告诉 grep 不产生输出,如果模式匹配则成功退出。这可以直接与 if 一起使用;没有必要在测试 [[ 中包装所有内容(尤其是没有必要无用地使用 cat)。

我还稍微修改了您的模式,因此 #!/bin 之间的 space 是可选的。

值得注意的是,如果匹配项位于文件的不同行,或者使用了另一个 shebang,这将产生误报。您可以通过管道 head -n 1 到 grep 来解决第一个问题,这样只会检查第一行:

if head -n 1 "$file" | grep -q '^#! */bin'

如果您正在搜索已知的 shebang 列表,例如/bin/sh/bin/bash,您可以将模式更改为 ^#! */bin/\(sh\|bash\)