变量中get的Bash脚本\n

变量中get的Bash脚本\n,bash,Bash,在谷歌上搜索监视MongoDB某些功能的方法时,我发现了一个脚本,用于检查MongoDB中replicaSet的状态。脚本在bash中完成 last_oplog_date=`/usr/local/bin/mongo --eval "db.printReplicationInfo()" | grep 'oplog last event time' | awk 'BEGIN { FS = "time:" } ; { print $2 }'` last_oplog_timestamp=`date -j

在谷歌上搜索监视MongoDB某些功能的方法时,我发现了一个脚本,用于检查MongoDB中replicaSet的状态。脚本在bash中完成

last_oplog_date=`/usr/local/bin/mongo --eval "db.printReplicationInfo()" | grep 'oplog last event time' | awk 'BEGIN { FS = "time:" } ; { print $2 }'`
last_oplog_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$last_oplog_date" +%s`
lag=0
IFS="
"
for slave_replication_date in `/usr/local/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`
do
  slave_replication_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$slave_replication_date" +%s`
  lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`
  if [ $lag_seconds -gt $lag ]; then
    lag=$lag_seconds
  fi
done
exit $lag
这段代码的作者已经警告如果是用FreeBSD编写的。我试图在Linux中执行它,但奇怪的事情发生了。首先,我改变了他修改数据的方式

date -d "$var" "+%s"
脚本的第一部分没有循环。所以他得到了MongoDB的oplog的日期,并将其转换为时间戳。在第二部分中,他做了一个for循环来获取一些信息,然后用同样的方式进行转换。这就是你撞到我的地方

date: invalid date « Tue May 10 2016 13:49:31 GMT+0200 (CEST)\n Tue May 10 2016 13:49:31 GMT+0200 (CEST)»
您注意到脚本附加到第一个日期末尾的\n了吗?我试图用tr-d'\n'删除它,但也没有成功

因此,我无法进入脚本的最后一部分,因为\n此时出现“无效日期”错误,正在阻止我

我知道有些东西很容易修复,但我花了几个小时试图修复,但没有成功。有点沮丧

更新1:

我试图避免循环,但仍然没有成功。如果在bash中运行mongo命令,则会得到两个数据:

/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`

Output:
 Tue May 10 2016 13:49:31 GMT+0200 (CEST)
 Tue May 10 2016 13:49:31 GMT+0200 (CEST)
然后我尝试进入脚本并设法进入一个转义元素数组\n

IFS='\n' read -r -a array <<< "$var1"

echo "${array[0]}"
echo "${array[1]}"

 Tue May 10 2016 13:49:31 GMT+0200 (CEST)

IFS='\n'read-r-a数组我终于设法修复了它

IFS=""

var1=`/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`

oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $var1 )
IFS="$oldIFS"
for slave_replication_date in "${lines[@]}"
    do
        slave_replication_timestamp=`date -d "$slave_replication_date" "+%s"`
        lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`

         if [ $lag_seconds -gt $lag ]; then
                lag=$lag_seconds
                exit 1
         fi
done
希望它能帮助有同样问题的人


谢谢,我终于把它修好了

IFS=""

var1=`/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`

oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $var1 )
IFS="$oldIFS"
for slave_replication_date in "${lines[@]}"
    do
        slave_replication_timestamp=`date -d "$slave_replication_date" "+%s"`
        lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`

         if [ $lag_seconds -gt $lag ]; then
                lag=$lag_seconds
                exit 1
         fi
done
希望它能帮助有同样问题的人


谢谢

您是否可以编辑此问题以提供完整的复制程序,而无需遵循任何链接/包含问题中未包含的任何代码(或与当前问题无关的任何代码)?如果没有
\n
,查看您的日期将不会更有效。我猜
for
循环中
之后的代码将打印几行,这些行通过CR字符粘在一起,并保存为
从属复制\u date
循环变量中的一行。换句话说,
无效日期
错误消息是正确的。你知道如何修复它吗?其他方法?阅读。您是否可以编辑此问题以提供完整的复制程序,而无需遵循任何链接/包含问题中未包含的任何代码(或与当前问题无关的任何代码)?如果没有
\n
,查看您的日期将不会更有效。我猜
for
循环中
之后的代码将打印几行,这些行通过CR字符粘在一起,并保存为
从属复制\u date
循环变量中的一行。换句话说,
无效日期
错误消息是正确的。你知道如何修复它吗?其他方法?阅读。