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