6

这是我第一次尝试 BASH,我遇到了一个小问题。此脚本的目的是清理 ZFS 池并创建一个日志文件。

代码按预期工作,除了下面的第 19 行。(日志条目 $LOG_LINE)。我为调试目的添加了第 18 行,它正在工作。

第 18 行将“pool 'tankm' is healthy”写入日志,而第 19 行仅写入“pool”。从功能上讲,这些线在做同样的事情(至少在我看来),那么为什么一个工作而不是另一个工作。

我假设根本原因是 zpool status 命令输出中池名称之前的引号,并且我正在为此进行 char 替换,但我想了解这两行是如何以不同方式解释的。

提前感谢德克兰

#!/bin/bash

LOG_FILE=/home/declan/log/zfs_scrub
LOG_LAST=/home/declan/log/zfs_scrub_last

function LogEntry {
    echo -e "$(date "+%Y %m %d %T") ; $1" >>$LOG_FILE 2>&1
}

cp $LOG_FILE $LOG_LAST
rm $LOG_FILE

LogEntry "Starting ZFS Scrub"

for POOL in $(zpool list -H -o name) ; do
    LogEntry "Starting Scrub on $POOL"
    zpool scrub $POOL 2>/dev/null
    LOG_LINE=$(zpool status -x $POOL 2>&1)
    echo -e "$(date "+%Y %m %d %T") ; $LOG_LINE" >>$LOG_FILE 2>&1
    LogEntry $LOG_LINE
    LogEntry "Ending Scrub on $POOL"
done

LogEntry "Ending ZFS Scrub"
4

2 回答 2

5

您必须在周围添加双引号$LOG_LINE

LogEntry "$LOG_LINE"

否则,由空格分隔的每个元素都被解释为LogEntry函数的专用参数。

或者,您可以更改函数并使用$*$@引用所有参数:

function LogEntry {
    echo -e "$(date "+%Y %m %d %T") ; $*" >>$LOG_FILE 2>&1
}
于 2013-04-26T15:37:08.660 回答
1

根据我所学到的,我什至能够LOG_LINE完全删除该变量。这是最终的代码。

#!/bin/bash

LOG_FILE=/home/declan/log/zfs_scrub
LOG_LAST=/home/declan/log/zfs_scrub_last

LogEntry () {echo "$(date "+%Y %m %d %T") ; $1" >>$LOG_FILE 2>&1; }

cp $LOG_FILE $LOG_LAST
rm $LOG_FILE

LogEntry "Starting ZFS Scrub"

for POOL in $(zpool list -H -o name) ; do
    LogEntry "Starting Scrub on $POOL"
    zpool scrub $POOL 2>/dev/null
    LogEntry "$(zpool status -x $POOL 2>&1)"
    LogEntry "Ending Scrub on $POOL"
done

LogEntry "Ending ZFS Scrub"
于 2013-04-26T18:39:29.423 回答