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