Shell最多可以輸入多少個引數?

2022-01-19 21:03:52 字數 2501 閱讀 3969

在指令碼編寫過程中,通常會涉及到引數的輸入。譬如,sh 1.sh 10 20,在執行1.sh這個指令碼中,10即為第乙個引數,20即為第二個引數。有時,就會有這個疑惑,即shell指令碼最多可以支援多少個變數呢?疑惑之餘,編寫了如下指令碼,可求出shell指令碼中可輸入引數的最大個數。

該指令碼涉及到三個小指令碼:1.sh 2.sh 3.sh --在這裡為了方便,指令碼名都是極其簡單的。總的思路是給定乙個特定的值n,作為輸入引數的最大個數,然後將1,2,3...n作為指令碼的輸入引數,這通過指令碼2.sh來實現,接著原樣輸出這些引數。如果這些引數全部都能輸出,即代表給定的n是合理的。這通過指令碼3.sh來實現。1.sh實現的功能是通過乙個死迴圈,遞增生成n,通過引用2.sh來判定n是否合理。具體可見如下指令碼。

首先我們來看看第乙個指令碼1.sh

#!/bin/bash

i=0echo

0 >currnumber

while

true

doi=$[$i+1]

sh2.sh

$i

if [ $? -ne 0 ];then

echo $i >maxnumber

exit

1else

sed -i '

1s/$/&

'$i'/'

currnumber

fidone

該指令碼主要是提供了乙個死迴圈,$i指的是可輸入引數的個數,2.sh用於判定給定引數的個數是否合理,如果合理,則將該數值追加到currnumber這個檔案中,如果不合理,則代表$i-1是shell能接受的最大引數個數。則將該數值輸出到maxnumber檔案中。

currnumber檔案的應用便於檢測指令碼的執**況。原打算是echo $i >> currnumber,即每乙個合理的數值都輸出一行,考慮到檔案有最大行數的限制,在這裡,就將數值輸出到一行。sed -i '1s/$/& '$i'/' currnumber即實現該功能,將$i的值新增到行尾。

再來看看指令碼2.sh

#!/bin/bash

rm -f 1

.test

touch

1.test

num=$1

echo

"#!/bin/bash

" > 1

.test

echo

"sh 3.sh

" >> 1

.test

for ((i=1; i<=$num; i++))

dosed -i '

2s/$/&

'$i'/'

1.test

done

sh1.test

指令碼2實現的功能是將1,2,3...$i作為3.sh的輸入引數,同樣,sed -i '2s/$/& '$i'/' 1.test實現的是將1,2,3...n輸出到一行。譬如如果$num=10,則1.test的內容如下所示:

#!/bin/bash

sh3.sh12

3456

78910

最後我們來看看指令碼3.sh

#!/bin/bash

echo

0 > 2

.test

num=$#

for ((i=1;i<=$num;i++))

dosed -i '

1s/$/&

'$i'/'

2.test

shift

1done

該指令碼實現的是原樣輸出輸入引數,並將該輸入引數輸出到2.test中。同樣,sed -i '1s/$/& '$i'/' 2.test實現的是追加引數到一行。

總結:1> sh 1.sh即可求出shell指令碼允許的最大輸入引數個數。

2> 因條件有限,沒有具體求出該值。但我們可跳過1.sh,單純的通過2.sh來判定特定的數值。如,sh 2.sh 100000,經測試100000個輸入引數沒有問題。

3> 該指令碼的亮點是如何將特定的值追加到行尾,這主要通過sed -i '1s/$/& '$i'/' 2.test來實現,其實1s代表第一行。$代表行尾。

4> 在vim中,0可跳到行首,$可跳到行尾。

5> shift左移輸入引數的位置。預設是左移1位。如shift 3表示原來的$4現在變成$1,原來的$5現在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。

6> 該指令碼存在乙個隱患,即文字檔案的行有最大的字元限制。但將100000作為輸入引數個數進行測試時,沒有問題,說明文字檔案一行還是能容納相當數量的字元。

ps: 在監測2.test的結果時,我們可以用watch cat 2.test,即每兩秒檢視一下2.test的內容,但該法有個弊端,資料較多時,無法在乙個螢幕中顯示,它只會顯示前面固定的資料,新增的資料不會顯示,但在該例中,我們更加關心的是資料是否增加。如下指令碼可實現該功能:

#!/bin/bash

while

true

docat

2.test

sleep

30done

MongoDB 中最多可以使用多少個集合

官方 有關於這個問題的說明 using a large number of collections 預設情況下,mongodb 的每個資料庫的命名空間儲存在乙個 16mb 的 ns 檔案中,平均每個命名占用約 628 位元組,也即整個資料庫的命名空間的上限約為 24000。每乙個集合 索引都將占用乙...

剪貼簿最多可以存放多少個貼上物件

剪貼簿最多可以存放24項內容,剪貼簿可隨存放資訊的大小而變化的記憶體空間,用來臨時存放交換資訊 內建在windows並且使用系統的內部資源ram,或虛擬記憶體來臨時儲存剪下和複製的資訊,可以存放的資訊種類是多種多樣的。剪貼簿可容納多達24項內容。剪貼簿可隨存放資訊的大小而變化的記憶體空間,用來臨時存...

Linux下最多有多少個程序

程序 系統分配資源的載體,是程式執行的例項 執行緒 程式執行的最小單元,是程序中的乙個實體用來執行程式,乙個系統中的程序數量肯定是有上限的,因為系統資源是有限的,同樣的道理,乙個程序中的執行緒資源也是有上限的。ulimit n可以檢視乙個程序最多可以開啟多少檔案描述符數,這個命令就可以檢視系統中的程...