【问题标题】:Bash script error server issueBash脚本错误服务器问题
【发布时间】:2015-05-27 15:48:14
【问题描述】:

我有以下 bash 脚本

#!/bin/bash

servers="server1.... server2...."
seconds="3"  # value for servers to differ (in seconds)
now=$(date +%s)
for server in $servers
do
    ssh -l root ${server} "( date +%s )" > /tmp/.tmpdate
    echo "-" $(date +%s) >> /tmp/.tmpdate
    difference=$(awk -F '-' '{if ($1-$2 < 0) { print $2-$1 } else { print $1-$2} }' /tmp/.tmpdate)
    if [[ $difference -le $seconds ]] ; then
        echo $server - IN SYNC
    else
        echo $server - NOT IN SYNC 
    fi
done

difference=$(awk -F '-' '{if ($1-$2 &lt; 0) { print $2-$1 } else { print $1-$2} }' /tmp/.tmpdate) 行出现语法错误,导致脚本的其余部分不准确。有什么想法吗?

【问题讨论】:

  • 提供 exact 错误会很有帮助。单独站立,awk 线路完美运行! (此外,应将 awk 问题标记为 awk;它是一种单独的编程语言,不是 bash/shell 语法的一部分)。
  • ...现在,这里还有一堆引用问题,其中一些是强制性的,因为将字符串 (servers) 视为数组而不是使用真实的bash 数组,但除非您处理值中令人惊讶的数据,否则这些不会对您的直接问题负责。
  • 尝试删除-F'-' 分隔符之间的空格。到awk -F'-' '{if ($1-$2 &lt; 0) { print $2-$1 } else { print $1-$2} }' /tmp/.tmpdate
  • @QuoVadis,我很好奇——需要哪个实现? (我在 GNU awk 中测试了现有的 awk 命令是否可以工作)。
  • @CharlesDuffy sun0S ;-)。

标签: linux bash syntax scripting


【解决方案1】:

我们可以简化一些:

#!/bin/bash 

servers="server1.... server2...."
seconds="3"  # value for servers to differ (in seconds)
for server in $servers
do
  remote=$(ssh -l root ${server}  date +%s ) 
  now=$(date +%s)
  if [ "$remote" -gt "$now" ]
  then
    diff=$(expr $remote - $now)
  else
    diff=$(expr $now - $remote)
  fi
  echo $diff

  if [[ $diff -gt $seconds ]] ; then
    echo $server - NOT IN SYNC 
  else
    echo $server - IN SYNC
  fi
done

【讨论】:

  • 现代数学语法 -- if (( remote &gt; now )); then diff=$(( remote - now )); else diff=$((now - remote)); fi -- 可能更可取。 $(( )) 实际上是 POSIX sh 标准的一部分,所以即使你想支持 /bin/sh,仍然不需要 expr。
  • 就个人而言,我更喜欢“declare -i”。但总是试图根据问题的风格调整答案。
  • $(( ... )) 是 POSIX; declare 是纯粹的 bashism(甚至它最亲近的家族 ksh 也使用 typeset 代替)。仅从便携性的角度来看,它不一定是最佳选择。
  • 我对上述语法进行了一项调整,将now=$(date +%s) 移动到remote=$(ssh -l root ${server} date +%s ) 之后,以检查ssh 之后的时间以允许连接时间
  • @Pol,好主意,已在答案中更新。然后我必须假设其余部分满足您的要求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多