關於 Bash shell script 的函式(function)介紹,今天介紹的的就是『返回值』,有呼叫函式就有可能會有返回值。可是這返回值也很特別,不是要 return 什麼,而是要使用變數去接或者直接輸出(echo)訊息。而我個人比較偏好使用 echo 來接收返回值,我的理由就是-『全域變數越少越好』啦!
關於 Bash shell script 的函式(function)介紹,今天介紹的的就是『返回值』,有呼叫函式就有可能會有返回值。可是這返回值也很特別,不是要 return 什麼,而是要使用變數去接或者直接輸出(echo)訊息。而我個人比較偏好使用 echo 來接收返回值,我的理由就是-『全域變數越少越好』啦!
Shell Script 函式有返回值的操作方式:
function_name(){
some command
echo “Some thing”
}
# 呼叫 function _name 並取得該函式的返回值
result=$(function_name)
echo “取得返回值為 $result”
所以要取得函式返回值就必須使用 $() 將函式包起來,就可以取得返回值了!那麼就讓我們繼續來提高程式碼的可讀性囉!
#!/bin/bash
# Perfoce 指令
P4COMMAND=/usr/local/bin/p4
# workspace variables
MyProjectLog=/home/pajace_chen/Perforce_Check/MyProjectUpdateLog.log
# Perforce workspace
export MyProjectWorkspace=MyProject
# 要登入 Perfroce 所需的環境變數
export P4CLIENT=$MyProjectWorkspace
export P4PASSWD=1234567890
export P4USER=pajace2001
export P4PORT=192.168.0.1:1666
LogCodeChanged(){
# 將第一個參數指派給 logFile 變數
logFile=$1
output=$2
# 用 echo 記錄一些相關資料
echo "`date`: My Project 的程式碼有更動." >> $ logFile
echo "`date`: 觸發自動建置功能" >> $ logFile
# 將執行 p4 sync 的結果寫到 log 檔案中
echo "$output" >> $ logFile
}
LogNoChange(){
$output=$1
$logfile=$2
# 沒有程式碼更動也寫一下 log 好做偵錯時使用
echo "`date`: MyProject 中沒有程式碼更動. Output: $output " >> $logfile
}
TriggerAutoBuildMyProject(){
#用 wget 去開啟網頁,觸發自動建置,不是真的需要網頁的內容
wget http://192.168.0.2:8080/jenkins/job/MyProject/build?token=TriggerBuild
# 因為使用 wget 去抓網頁,會留下不需要的檔案,所以刪掉他
rm build?token*
}
LogoutPerforce(){
$P4COMMAND logout
}
LoginPerforce(){
# 這一步驟是要登入 perforce
echo $P4PASSWD | $P4COMMAND login >&2
}
IsCodeChanged(){
# $1 : p4 sync 所顯示的訊息
output=$1
# 如果執行 p4 sync 的結果有包含 MyProject
if [[ "$output" =~ //MyProject* ]]; then
return 1;
else
return 0;
fi
}
GetP4CommandSyncOutputMessage(){
$P4COMMAND sync 2>&1
}
# ----------------------------------------------
LoginPerforce
LOG_FILE=$MyProjectLog
# 這一步驟是要將 p4 sync 的結果 assign 給OUTPUT 這個變數
OUTPUT=$(GetP4CommandSyncOutputMessage)
if [[ $(IsCodeChanged $OUTPUT) ]]
then
LogCodeChanged $LOG_FILE $OUTPUT
TriggerAutoBuildMyProject
else
LogNoChange $LOG_FILE $OUTPUT
fi
LogoutPerforce
有沒有發現我這次把主要流程(71-86行)的註解全部刪除了,但是程式碼還是很清楚對不對!這樣一來就算沒有註解也是看得懂這支 shell script 是在做什麼!
正所謂讀程式的時間可是大於寫程式阿~所以就算是寫 shell script 也是要提高他的可讀性才行!除了這個原因,在最後的幾天理我還會介紹一個東西,讓寫函式變的更重要!