shell腳本中main函數中$#獲取不到腳本傳入參數個數淺析
2024-03-14 11:01 瀟湘隱者 閱讀(353) 評論(0) 收藏 舉報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;
掃描上面二維碼關注我
如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力!
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
浙公網安備 33010602011771號