Linux的shell腳本,有時候我們在運行shell腳本時會給腳本傳入參數,出於邏輯上的嚴謹,在腳本中可能會做一些邏輯判斷或處理,例如判斷腳本傳入參數的個數。一般我們會用$#獲取傳入參數的個數,假如,我們在shell腳本的main函數中去判斷腳本傳入參數的個數,類似如下所示: .........f ...
Linux的shell腳本,有時候我們在運行shell腳本時會給腳本傳入參數,出於邏輯上的嚴謹,在腳本中可能會做一些邏輯判斷或處理,例如判斷腳本傳入參數的個數。一般我們會用$#獲取傳入參數的個數,假如,我們在shell腳本的main函數中去判斷腳本傳入參數的個數,類似如下所示:
.........
function main()
{
if [ $# != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
check_enviroment;
send_slow_rpt;
return 0;
}
main;
如果你去調試這個shell腳本的話,就會發現main函數中$#的值永遠是0, 如果將腳本調整一下,將判斷傳入參數個數的腳本放到main函數外(不能放在其它函數中),如下所示,這樣就Ok了
.............
if [ $# != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
.............
function main()
{
check_enviroment;
send_slow_rpt;
return 0;
}
main;
那麼為什麼會出現這種情況呢?在解答這個問題前,我們先來瞭解一下$#的用途,$#表示腳本傳入參數的個數,也表示一個函數(function)調用時,傳入函數的參數(arguments)個數,而且它也是有作用域範圍,如果在函數(function)內部的話,它表示的函數調用時,傳入參數的個數。
那麼再來解答這個問題,上面shell腳本中,main函數調用時寫法為main;意味著函數調用時沒有傳入任何參數,所以$#在main中值為0,而在腳本mysql_slowlog_monitor.sh中獲取傳入的參數個數,應該在腳本中,而且在腳本中的函數外面獲取它的值。
那麼怎麼解決這個問題呢?
解決方案1:
將判斷腳本調用時傳入的參數的腳本放到函數外面,就像上面示例腳本那樣處理。
解決方案2:
藉助全局變數,先在函數外獲取腳本傳入參數的個數,將其賦值為全局變數,然後在mian函數中,進行邏輯判斷和處理。
.............
ARGS=$#
.............
function main()
{
if [ $ARGS != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
check_enviroment;
send_slow_rpt;
return 0;
}
main;