簡體   English   中英

Bash變量失去了價值-奇怪

[英]Bash Variable losing its value - strange

注意FTP_PUT_RETVAL 有兩個echo命令,第一個顯示值'0'。 第二個沒有顯示任何價值。 我在一個夜間的cron里面跑這個。 BASHGNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

我的腳本告訴我ftp上傳不成功,因為FTP_PUT_RETVAL沒有包含值!

這是為什么會發生的? 我怎么能改變這個? 我做錯了什么?

    #!/bin/sh
    #
    # Filename: rh5-manager-cron.sh
    #
    # Purpose: Runs backup.cron, and FTP uploads backup to Linux4
    #
    # Usage: the program is run with no arguments. This program is
    # intended to run from manager cron, and redirection is handled inside the cron
    #     e.g. 00 1 * * * /u2/app/lbin/rh5-manager-cron.sh > /tmp/log/rh5-manager-cron.log 2>&1
    trap signalCaught ABRT EXIT HUP INT PIPE TERM QUIT
    signalCaught () {
        for file in $FTP_LOG_FILE $TMPF; do
            $BIN_HOME/rm_file $TMPF
        done
        exit
    }

    if [[ ! -r /u2/conf/ctrl/lettus.sh || ! -r /u2/app/lbin/fsh_sh_lib ]]; then
        printf "Cannot source environment.\n" >&2
        exit 1
    fi
    . /u2/conf/ctrl/lettus.sh
    . /u2/app/lbin/fsh_sh_lib

    #-------------------------------------------------------
    # Variables
    #-------------------------------------------------------
    PRG=${0##*/}
    FTPUSER=dummy
    FTPPASS=dummy
    FTPHOST=192.168.0.3
    BACKUPDIR=/backup
    FTPBACKUPNAME=Redhat5Backup.tgz
    FTPBACKUPFILE=$BACKUPDIR/$FTPBACKUPNAME
    LOGDIR=/tmp/log
    FTP_LOG_FILE=$LOGDIR/Redhat5FTP.log
    SENDLOGS=$C/sendlogs.dat
    ZOOT_XML=$C/zoot.xml
    TMPF=`mktemp` || exit 1

    #-------------------------------------------------------
    # Sanity
    #-------------------------------------------------------
    if ! isValidUser root manager; then
        printf "$PRG: Must be run as user 'root' or user 'manager'.\n" >&2
        exit 1
    fi

    if [[ ! -d $BACKUPDIR ]]; then
        logger "$PRG: $BACKUPDIR: Not a valid directory" >&2
        exit 1
    fi

    if [[ ! -d $LOGDIR ]]; then
        logger "$PRG: $LOGDIR: Not a valid directory" >&2
        exit 1
    fi

    if [[ ! -r $SENDLOGS || ! -r $ZOOT_XML ]]; then
        logger "$PRG: E-mail: Files are not readable: $SENDLOGS, $ZOOT_XML" >&2
        exit 1
    fi

    if ! which lftp >/dev/null 2>&1; then
        logger "$PRG: lftp: command not found" >&2
        exit 1
    fi

    # e-mail
    EMAIL_SUBJECT="Redhat5 FTP PUT"
    EMAIL_TO=$(email_to $SENDLOGS)
    EMAIL_FROM=$(email_from $ZOOT_XML)

    # ftp binary
    LFTP_BIN=$(which lftp 2>/dev/null)

    #-------------------------------------------------------
    # Functions
    #-------------------------------------------------------

    # calls lftp to upload a file to server non-interactively
    ftp_put() {
        $LFTP_BIN $LFTP_DEBUG -u ${FTPUSER},${FTPPASS} $FTPHOST <<-EOF
    put $FTPBACKUPFILE
    pwd
    ls $FTPBACKUPNAME
    quit
    EOF
    #^^^^^^^^^^^ leave the above indentation alone
    }

    main() {
        # Backup, and send manager logs
        logger "Running backup.cron..."
        echo
        backup.cron
        BACKUP_CRON_RETVAL=$?

        logger "Running fsh_sendlogs..."
        echo
        $SH_HOME/fsh_sendlogs 1

        # show ls listing
        logger "Here comes a directory listing..."
        echo
        /bin/ls -l /backup/Redhat5Backup.tgz
        echo

        # ftp upload
        logger "Running ftp upload..."
        echo
        ftp_put
        FTP_PUT_RETVAL=$?
        echo " -- debug: Line ${LINENO:-}: FTP_PUT_RETVAL=${FTP_PUT_RETVAL:-}"
    }

    checkSuccess() {
        if [[ "$BACKUP_CRON_RETVAL" -eq 0 ]]; then
            echo "Backup was successful."
            echo
            echo "*********************************"
            echo "   OK: Backup was successful."
            echo "*********************************"
            echo
        else
            echo "ERROR: Backup FAILED! "
            echo
            echo "*********************************"
            echo "     ERROR: Backup FAILED! "
            echo "*********************************"
            echo
        fi

        echo " -- debug: Line ${LINENO:-}: FTP_PUT_RETVAL=${FTP_PUT_RETVAL:-}"
        if [ "$FTP_PUT_RETVAL" -eq 0 ]; then
            echo "lftp: ftp file upload complete."
            echo
            echo "*********************************"
            echo "  OK: ftp file upload complete."
            echo "*********************************"
            echo
        else
            echo "lftp: error ftp file upload not successful."
            echo
            echo "*********************************"
            echo "      ERROR: file upload"
            echo "       NOT successful."
            echo "*********************************"
            echo
        fi
    }

    email_logs() {
        if [[ -z "$EMAIL_FROM" || -z $EMAIL_TO || -z $EMAIL_SUBJECT || ! -r $FTP_LOG_FILE ]]; then
            logger "$PRG: One of the variables is not correctly configured" >&2
            exit 1
        fi
        fsh_mail -r "${EMAIL_TO}" -F "${EMAIL_FROM}" -s "${EMAIL_SUBJECT}" -t "${FTP_LOG_FILE}"
        return
    }

    #----------------------------------------------------------------------
    # Main Program
    #----------------------------------------------------------------------
    main               | tee $FTP_LOG_FILE
    checkSuccess       | tee -a $FTP_LOG_FILE $TMPF
    cat $FTP_LOG_FILE >> $TMPF

    # E-mail ftp log file
    logger "Emailing ftp logfile"
    echo
    email_logs

    #eof

問題是你正在使用:

main               | tee $FTP_LOG_FILE
checkSuccess       | tee -a $FTP_LOG_FILE $TMPF

由於管道的原因, main中完成的工作在子外殼中完成,並且子外殼無法在父外殼中設置變量。 因此,當checkSuccess (也在子外殼程序中運行)查看結果時,它會看到父外殼程序中的內容(什么都沒有),而不是子外殼程序中main函數中設置的內容。

如果您掉下管道,它將開始工作。

更可靠地, checkSuccess的調用放入main函數中。 或使用以下兩種表示方式中的一種:

{ main; checkSuccess; } | tee $FTP_LOG_FILE $TMPF
( main; checkSuccess )  | tee $FTP_LOG_FILE $TMPF

請注意, { ... }表示法在第二個函數( ... )表示法不需要之后需要使用分號。 但是, { ... }機制中涉及的進程少了一個,而不是它會對整體性能產生任何可測量的差異(FTP時間將占主導地位)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM