我不确定为什么代码中提供的重定向不起作用。每次运行脚本时,输出文件始终为空。有没有人对此有所了解?
感谢。
#!/bin/sh
LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`
for i in $FILES
do
# echo "Looking in $i ..."
unzip -p $i | grep -i $LOOK_FOR > output #> /dev/null
if [ $? == 0 ]
then
echo ">>>> Found $LOOK_FOR in $i <<<<"
fi
done
答案 0 :(得分:9)
您可能希望使用>>
(追加)代替>
(覆盖)进行重定向:
unzip -p $i | grep -i $LOOK_FOR >> output #> /dev/null
由于您每次都在循环中执行此命令并覆盖文件output
,如果使用grep的最后一个命令找不到任何匹配项,最后可能是空白解压缩输出行。
答案 1 :(得分:3)
你有三个问题
ls
的输出。相反,只需使用for i in plugins/*source*.jar
主要原因是您的脚本将完全彻底打破名称中包含空格的任何文件。有关为何不解析ls
>>
而不是>
,因为后者将在循环的每次迭代时覆盖输出文件。前者将追加到它此外,您可以内联if
测试。所以把它们放在一起我们有:
#!/bin/sh
LOOK_FOR="DefaultProblem"
for i in plugins/*source*.jar
do
# echo "Looking in $i ..."
if unzip -p "$i" | grep -i "$LOOK_FOR" >> output #> /dev/null
then
echo ">>>> Found $LOOK_FOR in $i <<<<"
fi
done
答案 2 :(得分:2)
您可以重定向整个循环的输出:
#!/bin/sh
LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`
for i in $FILES ; do
# echo "Looking in $i ..." 1>&2
unzip -p $i | grep -i $LOOK_FOR
if [ $? == 0 ] ; then
echo ">>>> Found $LOOK_FOR in $i <<<<" 1>&2
fi
done > output
请注意,我已将诊断消息重定向到stderr。
答案 3 :(得分:0)
您可以在一个for loop
命令中执行所有操作,而不是if conditional
和find
find /path/to/plugins -name "*source*.jar" -exec sh -c 'unzip -l "{}" | grep -q DefaultProblem' \; -print