2013-04-26 61 views
4

這是我第一次嘗試BASH,我遇到了一個小問題。 該腳本的目的是清理ZFS池並創建一個日誌文件。BASH pass變量到函數

該代碼正常工作,除了第19行以下。 (LogEntry $ LOG_LINE)。 我添加了第18行用於調試目的,它工作。

第18行寫入「pool」tankm'健康「到日誌,而第19行只有wirtes」pool「。在功能上,這些線路正在做同樣的事情(至少對我來說),所以爲什麼一個人會工作,而不是另一個。

我假設root casue是在zpool status命令的輸出中的池名之前的引號,我正在爲這個char替換而工作,但我會想知道這兩行是如何被interprited不同。

在此先感謝 德克蘭

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

回答

5

您必須添加周圍$LOG_LINE雙引號:

LogEntry "$LOG_LINE" 

否則由空格分隔每個元素被解釋爲專用參數來LogEntry功能。

或者你可以改變你的功能和使用$*[email protected]引用所有參數:

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

謝謝 我並不是真的在找工作,第18行是我的工作。我想知道爲什麼第19行不行。 – 2013-04-26 18:00:56

+0

@chepner有它 - 圍繞變量名添加引號是解決方案。 – 2013-04-26 18:29:12

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"