#!/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 FILE
FILE
do
done
换句话说,它获取 find 命令的输出(以 结尾的文件列表jar
)并在循环中运行代码块。对于短列表,它的行为与使用for i in
循环的版本完全相同。优点是它支持长列表,因为您可以在命令行上传递的内容有上限,就像您在for i in
循环中所做的那样。
编辑:改为 bash 脚本,改变变量引用的样式,包括来自评论的建议和一些其他样式的改变。
答案2
您应该能够使用$?。
在 bash 中,$? 存储命令的返回值。您可以在 grepjar 命令后检查此值,然后回显 $i 以查看是否符合您的要求。