在腳本編寫過程中,通常會涉及到參數(shù)的輸入。譬如,sh 1.sh 10 20,在執(zhí)行1.sh這個腳本中,10即為第一個參數(shù),20即為第二個參數(shù)。有時,就會有這個疑惑,即shell腳本最多可以支持多少個變量呢?疑惑之余,編寫了如下腳本,可求出Shell腳本中可輸入?yún)?shù)的最大個數(shù)。
該腳本涉及到三個小腳本:1.sh 2.sh 3.sh --在這里為了方便,腳本名都是極其簡單的。總的思路是給定一個特定的值n,作為輸入?yún)?shù)的最大個數(shù),然后將1,2,3...n作為腳本的輸入?yún)?shù),這通過腳本2.sh來實現(xiàn),接著原樣輸出這些參數(shù)。如果這些參數(shù)全部都能輸出,即代表給定的n是合理的。這通過腳本3.sh來實現(xiàn)。1.sh實現(xiàn)的功能是通過一個死循環(huán),遞增生成n,通過引用2.sh來判定n是否合理。具體可見如下腳本。
首先我們來看看第一個腳本1.sh
該腳本主要是提供了一個死循環(huán),$i指的是可輸入?yún)?shù)的個數(shù),2.sh用于判定給定參數(shù)的個數(shù)是否合理,如果合理,則將該數(shù)值追加到currnumber這個文件中,如果不合理,則代表$i-1是shell能接受的最大參數(shù)個數(shù)。則將該數(shù)值輸出到maxnumber文件中。
currnumber文件的應(yīng)用便于檢測腳本的執(zhí)行情況。原打算是echo $i >> currnumber,即每一個合理的數(shù)值都輸出一行,考慮到文件有最大行數(shù)的限制,在這里,就將數(shù)值輸出到一行。sed -i '1s/$/ '$i'/' currnumber即實現(xiàn)該功能,將$i的值添加到行尾。
再來看看腳本2.sh
腳本2實現(xiàn)的功能是將1,2,3...$i作為3.sh的輸入?yún)?shù),同樣,sed -i '2s/$/ '$i'/' 1.test實現(xiàn)的是將1,2,3...n輸出到一行。譬如如果$num=10,則1.test的內(nèi)容如下所示:
最后我們來看看腳本3.sh
該腳本實現(xiàn)的是原樣輸出輸入?yún)?shù),并將該輸入?yún)?shù)輸出到2.test中。同樣,sed -i '1s/$/ '$i'/' 2.test實現(xiàn)的是追加參數(shù)到一行。
總結(jié):
1> sh 1.sh即可求出shell腳本允許的最大輸入?yún)?shù)個數(shù)。
2> 因條件有限,沒有具體求出該值。但我們可跳過1.sh,單純的通過2.sh來判定特定的數(shù)值。如,sh 2.sh 100000,經(jīng)測試100000個輸入?yún)?shù)沒有問題。
3> 該腳本的亮點是如何將特定的值追加到行尾,這主要通過sed -i '1s/$/ '$i'/' 2.test來實現(xiàn),其實1s代表第一行。$代表行尾。
4> 在vim中,0可跳到行首,$可跳到行尾。
5> shift左移輸入?yún)?shù)的位置。默認(rèn)是左移1位。如shift 3表示原來的$4現(xiàn)在變成$1,原來的$5現(xiàn)在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。
6> 該腳本存在一個隱患,即文本文件的行有最大的字符限制。但將100000作為輸入?yún)?shù)個數(shù)進行測試時,沒有問題,說明文本文件一行還是能容納相當(dāng)數(shù)量的字符。
PS: 在監(jiān)測2.test的結(jié)果時,我們可以用watch cat 2.test,即每兩秒查看一下2.test的內(nèi)容,但該法有個弊端,數(shù)據(jù)較多時,無法在一個屏幕中顯示,它只會顯示前面固定的數(shù)據(jù),新增的數(shù)據(jù)不會顯示,但在該例中,我們更加關(guān)心的是數(shù)據(jù)是否增加。如下腳本可實現(xiàn)該功能:
標(biāo)簽:南充 通遼 雅安 隨州 延邊 青島 朝陽 西藏
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Shell最多支持多少個參數(shù)?》,本文關(guān)鍵詞 Shell,最多,支持,多少,個,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。