在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
答案 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\)
。