在 shell 脚本中,我试图找出另一个文件是否是 shell 脚本。我通过 greping 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
之间的空格是可选的。值得注意的是,如果匹配位于文件的不同行,或者使用另一个 shebang,这会产生误报。您可以通过管道
head -n 1
到 grep 来解决第一个问题,这样就只检查第一行:
if head -n 1 "$file" | grep -q '^#! */bin'
如果您正在搜索已知的 shebangs 列表,例如
/bin/sh
和
/bin/bash
,您可以将图案更改为
^#! */bin/\(sh\|bash\)
之类的内容。
cat
包裹在
$()
中,没有它它也可以工作(至少对我来说,它不能与它一起工作):
if [[ $(cat $file | grep '^#\!/bin' | wc -l) -gt 0 ]]; then
echo 'file is a script!';
else
echo "no script";
fi
另外,我认为grep -q
是一个很好的建议,它使脚本更加紧凑。