2012-09-13 89 views
0

我遇到了一個問題,我的echo參數列表太長,想要解決一些問題,或者至少測試一下這個問題,以便我可以正確處理它,它不會殺死我的腳本Echo:參數列表太長

for file in `cat filelist`; do 
    PROTOCOLS1=`egrep -i 'rsh|rsync|remsh' "$file" | egrep -v '^[ |  ]*#'` 
    FIELDS=`echo $PROTOCOLS1|wc -l` 
    if [[ $FIELDS -gt 1024 ]]; then 
     echo $file >> $debuglog 
    else 
     set -A myarray $PROTOCOLS1 
     do stuff..... 
    fi 
done 

所以問題是,當我回聲ARG列表太長,$FIELDS設置爲null,因此我對$FIELDS -gt 1024測試始終是真實的,不被抓。 問題是,當它進入數組顯然太大,我得到一個下標超出範圍錯誤,我的腳本退出。

任何想法,不勝感激。


編輯9/18

OK,所以這個問題是一個小更基本。

myserver-v1> echo $variable 
myserver-v1> /usr/bin/echo: too many args 

我想在我的腳本來測試這種

我嘗試以下,這工作,但我得到這一切廢話到標準輸出,填補了我的調試日誌,是惱人的

echo $variable 
if [[ $? -ne 0 ]]; then 
write to error log 
fi 

有沒有辦法測試echo $ variable ....而不發送到標準輸出? 我嘗試了以下,但似乎都沒有工作,所以我在這裏有點不知所措。

[[ ! `echo $variable ]] 
[[ `echo $variable ]] 
+0

爲什麼不在設置之後使用'$ {#myarray [*]}'獲取數組的長度(看起來像字段數)?(對不起,我不熟悉ksh比bash) –

+0

'$(#myarry [*]}'在ksh93中工作(99%linux系統上的std(實際上並不是pdksh)如果'echo $ {。 sh.version}'return anything,then you have a ksh93。祝你好運 – shellter

+0

@evilotto我不能使用'$ {#myarray [*]}'因爲那樣會需要數組已經存在....問題是我無法創建超過1024個元素/字段的數組...因此,我必須能夠在運行'set -A數組'' – nitrobass24

回答

1

如果保持不帶引號的變量$PROTOCOLS1echo,您可以通過更換生活簡單化:

FIELDS=`echo $PROTOCOLS1|wc -l` 

FIELDS=1 

這是因爲當你迴音$PROTOCOLS1沒有任何報價在它周圍,你將只有一條(可能很長)的輸出。或者,你可以使用:

FIELDS=$(echo "$PROTOCOLS1" | wc -l) 

在雙引號將PROTOCOLS1的值保存換行符(但它可以讓你回到「參數列表太長」的問題)。

所以,你需要考慮使用:

FIELDS=$(egrep -i 'rsh|rsync|remsh' "$file" | egrep -c -v '^[ |  ]*#') 

它得到第二egrep做專線爲您計算。顯然,由於腳本的後面部分使用$PROTOCOLS1,您將需要重新評估egreps以獲取數據,但您應該考慮您的處理方案是否合適。如果遇到太長的字符串值,則可能不是以最佳方式進行處理。替代品的選擇取決於你想要做的事情,而這個問題沒有透露。用諸如Perl,Python或Ruby之類的腳本語言進行額外的處理可能是合適的。