BASH将变量传递给函数

BASH将变量传递给函数,bash,function,variables,quotes,Bash,Function,Variables,Quotes,这是我第一次尝试BASH,我遇到了一个小问题。 此脚本的目的是清除ZFS池并创建日志文件 除下面第19行外,代码按预期工作。(日志条目$LOG_行)。 为了调试目的,我添加了第18行,它正在工作 第18行将“池'tankm'正常”写入日志,而第19行仅将“池”写入日志。从功能上来说,这些线路都在做同样的事情(至少在我看来),那么为什么一条线路可以工作而另一条线路不行呢 我假设根casue是zpool status命令输出中池名之前的引号,我正在为它进行字符替换,但我想了解这两行的脚本编写方式是如

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

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

第18行将“池'tankm'正常”写入日志,而第19行仅将“池”写入日志。从功能上来说,这些线路都在做同样的事情(至少在我看来),那么为什么一条线路可以工作而另一条线路不行呢

我假设根casue是zpool status命令输出中池名之前的引号,我正在为它进行字符替换,但我想了解这两行的脚本编写方式是如何不同的

提前谢谢 德克兰


您必须在
$LOG\u行
周围添加双引号:

LogEntry "$LOG_LINE"
否则,由空格分隔的每个元素将被解释为
LogEntry
函数的专用参数

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

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

根据我所学到的,我甚至能够完全删除
LOG\u行
变量。这是最后的代码

#!/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"

谢谢,我不是真的在找工作,第18行是我的工作。我想知道为什么第19行没有;不起作用。@chepner有它-在变量名周围加引号是解决办法。
#!/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"