egrep在bash脚本中返回0,但手动执行返回正确值的命令unix bash

时间:2017-11-07 17:51:53

标签: bash shell unix ftp grep

我正在执行一个bash脚本,如果ftp连接失败或使用egrep成功返回我,问题是当我试图用egrep获取一个单词时返回0但是如果我执行了手动命令返回2.

这是我的代码:

#Create the FTP Connection.
for ip_address in ${IP_ADDRESS[@]}; do
  ftp ${ip_address} <<ftp_commands > ${FTP_RESULTS}
  user "${USER_ID}" "${USER_PASSWORD}"
  pwd
  bye
ftp_commands

ftp_result_id=`egrep -c "Login failed|Connection refused|Not connected|Connection timed out" ${FTP_RESULTS}`

if [ ${ftp_result_id} -gt 0 ]; then
    echo "$(date +%m/%d/%y_%H:%M:%S) - ${ip_address} - Not connected" >> ${CONNECTION_RESULTS_FILE}
else
    echo "$(date +%m/%d/%y_%H:%M:%S) - ${ip_address} - Connected" >> ${CONNECTION_RESULTS_FILE}
fi

done

ftp_results_id在egrep -c命令中返回0,但我在运行后手动执行并创建文件&#34; FTP_RESULTS&#34;并且正在工作,它假设找到2个匹配&#34;未连接&#34;

任何建议?

1 个答案:

答案 0 :(得分:1)

egrep -c命令计算匹配。 然后,如果匹配数超过0,则使用条件执行某些操作。

更简单,更好的解决方案是使用egrep的退出代码。 egrep如果找到匹配则退出0(=成功), 否则为非零。 您可以像这样编写if语句:

if egrep -q "Login failed|Connection refused|Not connected|Connection timed out" "${FTP_RESULTS}"; then

这相当于您发布的代码中的逻辑。 不需要ftp_result_id变量。 并且无需保存egrep的输出。 我添加了-q标志,以便egrep不会产生任何输出。 没有必要。