【问题标题】:Issue in a Bash loopBash 循环中的问题
【发布时间】:2018-04-13 09:43:19
【问题描述】:

只是一个我不理解的问题。一切正常 - 我只是想弄清楚一些事情。

我有一个非常简单的 Bash 脚本,它每天重新启动一次 dnsmasq:

LogFile="/var/log/logfile"
declare -a CMD_AR=()
declare -a ECHO_OUT=(stopping starting)
STOP=$(service dnsmasq \stop)
SLEEP=$(\sleep 15)
START=$(service dnsmasq \start)
CMD_AR+=($STOP)
CMD_AR+=($START)

z=0
while [[ $z -le 1 ]]; do
      DT=`date +%c`
      echo "$DT - ${ECHO_OUT[$z]} dnsmasq..." >> ${LogFile}
      eval ${CMD_AR[$z]} >> ${LogFile} 2>&1
      unset DT
      eval ${SLEEP}
      z=$[$z+1]
done

所以...这可行,但是 DT 变量永远不会改变。所以我的日志文件如下:

Tue 31 Oct 2017 10:57:07 PM MDT - stopping dnmasq
Tue 31 Oct 2017 10:57:07 PM MDT - starting dnmasq

时间字符串不应该至少相差15(sleep 15的值)秒吗?我不明白为什么循环没有重新计算 DT 变量 - 任何人?

此外,我也会对我的代码提出任何建议 - 在编写脚本方面,我是个彻头彻尾的黑客。

【问题讨论】:

  • 而 [[ $z -l e 1 ]]; do SLEEP="sleep 15"

标签: bash loops while-loop


【解决方案1】:

问题出在这一行:

SLEEP=$(\sleep 15)

这会将 SLEEP 变量设置为空字符串,因为命令 sleep 15 不会生成任何输出。

改成:

SLEEP="sleep 15"

解决您的问题。

线

START=$(service dnsmasq \start)

有同样的问题。


您的脚本似乎过于复杂 - 请通过 shellcheck 检查它。一般来说,将命令存储在变量中并通过eval 执行它们并不是一个好主意——请参阅BashFAQ/050。你的代码可以这样重写:

LogFile="/var/log/logfile"
z=0
while ((z <= 1)); do
    if ((z == 0)); then
      echo "$(date) - stopping dnsmasq..." >> "${LogFile}"
      service dnsmasq stop >> "${LogFile}" 2>&1
    else
      echo "$(date) - starting dnsmasq..." >> "${LogFile}"
      service dnsmasq start >> "${LogFile}" 2>&1
    fi
    sleep 15
    ((z++))
done

已完成的改进:

  • 使用(( .. )) 进行算术运算和检查
  • 用双引号将变量括起来以防止分词
  • 删除间接执行eval
  • 消除数组 - 我们在这里不需要它
  • 使代码更具可读性

这里的循环似乎是不必要的。代码可以写得更简洁:

LogFile="/var/log/logfile"
exec >"$LogFile" 2>&1
echo "$(date) - stopping dnsmasq..."
service dnsmasq stop
sleep 15
echo "$(date) - starting dnsmasq..."
service dnsmasq start

【讨论】:

  • 好的,谢谢 - 是的,我意识到这有点复杂,我只是为了真正做到这一点而制作了数组 - 这也不是我的脚本的全部内容,所以我已经定义了数组- 但这绝对是矫枉过正。我也觉得建议使用 eval 是可取的——事实上,我最初有“service dnsmasq restart”,当它工作时,我偶尔会在日志中收到关于“bad command”的错误消息。无论如何,感谢您的帮助-就像我说的,我是新手-乔什
  • 哦,谢谢你的 exec 命令 - 太棒了,shellcheck :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2020-02-17
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多