Dec*_*n_K 5 variables bash quotes function
这是我第一次尝试BASH,我遇到了一个小问题.此脚本的目的是擦除ZFS池并创建日志文件.
代码按预期工作,除了下面的第19行.(LogEntry $ LOG_LINE).为了调试目的,我添加了第18行,它正在运行.
第18行将"pool'tankm'健康"写入日志,而第19行只写"pool".从功能上讲,这些线路做的是同样的事情(至少在我眼里),所以为什么一个工作而不是另一个工作.
我假设根casue是zpool status命令输出中池名称之前的引用,我正在为此替换char,但我会理解这两行是如何以不同方式进行间接的.
在此感谢Declan
#!/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"
Run Code Online (Sandbox Code Playgroud)
你必须添加双引号$LOG_LINE:
LogEntry "$LOG_LINE"
Run Code Online (Sandbox Code Playgroud)
否则,由空格分隔的每个元素都被解释为LogEntry函数的专用参数.
或者,您可以更改您的函数并使用$*或$@引用所有参数:
function LogEntry {
echo -e "$(date "+%Y %m %d %T") ; $*" >>$LOG_FILE 2>&1
}
Run Code Online (Sandbox Code Playgroud)