6

これは BASH での私の最初の試みであり、小さな問題が発生しています。このスクリプトの目的は、ZFS プールをスクラブし、ログ ファイルを作成することです。

以下の 19 行目を除いて、コードは意図したとおりに機能しています。(ログエントリ $LOG_LINE)。デバッグ目的で 18 行目を追加しましたが、動作しています。

18 行目は「プール 'tankm' は正常です」をログに書き込みますが、19 行目は「プール」のみを書き込みます。機能的には、これらの行は同じことを行っています (少なくとも私の目には)。

zpool status コマンドの出力でプール名の前に引用符が付けられているのがルート ケースであると想定しており、そのための文字の置換に取り組んでいますが、これら 2 行の解釈がどのように異なっているかを理解するのは難しいと思います。

前もってありがとうデクラン

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

2 に答える 2

5

を二重引用符で囲む必要があります$LOG_LINE

LogEntry "$LOG_LINE"

それ以外の場合、空白で区切られた各要素は、LogEntry関数への専用の引数として解釈されます。

または、関数を変更して、$*またはを使用してすべての引数$@を参照することもできます。

function LogEntry {
    echo -e "$(date "+%Y %m %d %T") ; $*" >>$LOG_FILE 2>&1
}
于 2013-04-26T15:37:08.660 に答える
1

私が学んだことに基づいて、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"
于 2013-04-26T18:39:29.423 に答える