在grep中逃离Shebang

时间:2015-10-08 10:40:24

标签: shell escaping character shebang

在shell脚本中,我试图找出另一个文件是否是shell脚本。我正在通过打击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但是没有用。

也许你可以帮助我吗? :)

欢呼声, NARF

1 个答案:

答案 0 :(得分:1)

我建议你改变你的条件:

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

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

我还略微修改了您的模式,以便#!/bin之间的空格是可选的。

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

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

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