如何知道命令是否找到任何结果?

如何知道命令是否找到任何结果?
#!/bin/sh

LOOK_FOR="NTLMAuthenticationFilter"

for i in `find ./ -name "*jar"`
do
echo "Looking in $i ..."
grepjar -e $LOOK_FOR $i
done

我写了上面的脚本,并尝试查找这些 jar 中是否存在任何名为 LOOK_FOR 的文件名,我的任务是:grepjar -e $LOOK_FOR $i 这里我如何检查是否有任何成功的结果,并输出它们?

顺便问一下,shell 脚本中的 $? 是什么意思?谢谢!

答案1

尝试以下更改:

#!/bin/bash

LOOK_FOR="NTLMAuthenticationFilter"

find ./ -name "*.jar" -print | while read -r FILE
do
echo "Looking in ${FILE} ..."
grepjar -e "${LOOK_FOR}" "${FILE}" 2>/dev/null >/dev/null
RETCODE=${?}
if [ ${RETCODE} -eq 0 ]; then
  echo "Found ${LOOK_FOR} in ${FILE}"
fi
done

?变量存储最后一个命令的返回值。通常,该值表示0成功,其他值表示失败。

您还会注意到,我已将for命令切换为while命令。这样可以返回更大的结果集。


分解该find ./ -name "*.jar" -print | while read -r FILE命令:

find ./- 从当前目录开始... - 查找以...
-name "*.jar"结尾的文件- 并打印其名称- 将该输出重定向到下一个命令 - 当有前一个命令的输出时,将其分配给变量并运行和之间的命令。.jar
-print
|while read -r FILEFILEdodone

换句话说,它获取 find 命令的输出(以 结尾的文件列表jar)并在循环中运行代码块。对于短列表,它的行为与使用for i in循环的版本完全相同。优点是它支持长列表,因为您可以在命令行上传递的内容有上限,就像您在for i in循环中所做的那样。

编辑:改为 bash 脚本,改变变量引用的样式,包括来自评论的建议和一些其他样式的改变。

答案2

您应该能够使用$?。

在 bash 中,$? 存储命令的返回值。您可以在 grepjar 命令后检查此值,然后回显 $i 以查看是否符合您的要求。

相关内容