BASH将变量传递给函数

时间:2013-04-26 15:03:15

标签: bash function variables quotes

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

代码按预期工作,但下面的第19行除外。 (LogEntry $ LOG_LINE)。 我添加了第18行用于调试目的,它正在工作。

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

我假设根casue是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"

2 个答案:

答案 0 :(得分:5)

您必须在$LOG_LINE附近添加双引号:

LogEntry "$LOG_LINE"

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

或者,您可以更改自己的功能并使用$*$@来引用所有参数:

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

答案 1 :(得分:0)

根据我在这里学到的东西,我甚至可以完全删除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"