2017-06-06 49 views
0

我有一個shell腳本,如下所示。在shell腳本中使用變量時獲取正確的shell腳本狀態消息

#!/bin/bash 

source /home/$USER/source.sh 

[ $# -ne 1 ] && { echo "Usage : $0 table "; exit 1; } 

table=$1 

TIMESTAMP=`date "+%Y-%m-%d"` 
touch /home/$USER/logs/${TIMESTAMP}.success_log 
touch /home/$USER/logs/${TIMESTAMP}.fail_log 
success_logs=/home/$USER/logs/${TIMESTAMP}.success_log 
failed_logs=/home/$USER/logs/${TIMESTAMP}.fail_log 
touch /home/$USER/logs/${TIMESTAMP}.log 
logs=/home/$USER/logs/${TIMESTAMP}.log 

function log_status 
{ 
     status=$1 
     message=$2 
     if [ "$status" -ne 0 ]; then 
       echo "`date +\"%Y-%m-%d %H:%M:%S\"` [ERROR] $message [Status] $status : failed" | tee -a "${failed_logs}" 
       echo "$output" | tee -a "${logs}" 
     else 
        echo "`date +\"%Y-%m-%d %H:%M:%S\"` [INFO] $message [Status] $status : success" | tee -a "${success_logs}" 
        echo "$output" | tee -a "${logs}" 
     fi 
} 

Final=$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table) 

output=$(echo "$Final" | tail -1) 
echo "$output" 

g_STATUS=$? 
log_status $g_STATUS "spark $table" 

#output=$(echo "$Final" | tail -1) 
echo "$Final" 
#echo "$output" 
echo "****************************************************************************************************************************" 

在此變量output必須附加到文件。

現在,當我在腳本中有如下所示。

output=$(echo "$Final" | tail -1) 
echo "$output" 
echo "$Final" 

g_STATUS=$? 
log_status $g_STATUS "spark $table" 

我收到output變量在logs文件,該文件是我的預期結果打印出來。但shell script的狀態總是成功,即使Final =$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table)失敗

現在,當我在腳本中具有如下所示。

g_STATUS=$? 
log_status $g_STATUS "spark $table" 

output=$(echo "$Final" | tail -1) 
echo "$output" 
echo "$Final" 

然後shell script的狀態始終是成功的,如果Final =$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table)是成功和shell script的狀態總是失敗,如果Final =$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table)失敗

而且我沒有在logsoutput可變印刷文件。

我應該怎麼做才能讓output變量始終打印到logs文件並且具有正確的狀態消息。

我的意思是,如果Final =$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table)的狀態是成功的,那麼shell腳本狀態是成功的,如果不成功則失敗。

+2

未來,請嘗試使用[mcve]提出有關代碼的問題 - 使用最少量的代碼重現問題,並刪除並非嚴格需要的內容。 –

+2

順便說一句,http://shellcheck.net/將識別與此代碼的一些問題,而無需讓人蔘與。 –

回答

1

您是否嘗試在執行感興趣的子shell後保存狀態,然後在最後將其返回?

Final =$(spark-submit --name "Spark" --master "yarn-client" /home/$USER/import.py $table) 
g_STATUS=$? 
output=$(echo "$Final" | tail -1) 
echo "$output" 


log_status $g_STATUS "spark $table" 


echo "$Final" 

echo "****************************************************************************************************************************" 
return $g_STATUS 
+0

當然,你不需要'='之前的空格(這會導致腳本調用名爲Final的命令,而不是通過該名稱分配給變量)。 –

+0

好點。 Viru reddy,當你確認錯誤狀態在你想要傳播的任何地方傳播時,在等號之前刪除空格將修復變量賦值。 :) –

+0

@BjarturThorlacius該解決方案的工作原理,但我得到'返回:只能'從腳本執行 – User12345