2014-02-27 39 views
0

我有一個文件ut.txt,它有一個長度爲385186字節的單個值。我使用的是下面找到該值是否是數字:在if語句中貓期間的分段錯誤(coredump)

if [[ `cat ut.txt` = +([0-9]) ]] 
then 
echo "Numeric" 
fi 

這完美的作品上更小的文件。但隨着ut.txt(385186個字節),它給了我下面的錯誤:

Segmentation Fault(coredump) 

有人能提出一個方法,使這項檢查,同時避免錯誤?

回答

0

你有點濫用這裏反引號的功能。他們不應該處理那麼長的輸出。段錯誤不是什麼KSH應與反應,但我建議使用流版本而不是:

if egrep -q '^[0-9]+$' ut.txt 
then 
    echo "Numeric" 
fi 
+0

謝謝.. egrep肯定會幫助我在這裏(雖然我不能讓-q工作)。我考慮把值寫入一個可變的值(下面的命令中的變量'a')。你能解釋爲什麼以下幾點不適用於非常大的值?要檢查INTEGER:'[[$ a = +([0-9])]] && echo numeric'。檢查DECIMAL數字:'[[$ a = +([0-9])\。+([0-9])]] && echo float'。當使用非常大的值時,這些給我相同的「分段錯誤(coredump)」錯誤,但對於小數值運行完美。提前致謝。 – user3360088

+0

正如我所說的,這個功能不適用於大數據,如果你使用大數據,它可能會溢出一個ksh的內部緩衝區。如果在ksh中沒有檢查這個,可能會導致段錯誤。關於'-q':你可以通過使用重定向到/ dev/null來替換:'if egrep'^ [0-9] + $'>/dev/null'。 – Alfe

+0

如果你想允許浮動,只需使用'^ [0-9。] + $'。 – Alfe

0

您可以嘗試

grep -q '[a-zA-Z]' ut.txt || echo "Numeric" 

grep查找任何定義的序列([a-zA-Z])的,如果沒有找到你想要的東西(||echo ES。

更新在你可能有其他(如非ASCII,喜歡的重音)的評論中提及人物歸類爲不是數字。

在這種情況下,你可以使用

grep -q '[^0-9]' ut.txt || echo "Numeric" 

這將搜索任何其他比數字字符。

+0

這裏的問題是,我的文件可能包含連字符法國。也可能有其他特殊符號,我可能不會提前知道。所以,我希望所有隻有數字的東西都被認爲是「NUMERIC」。如果文件中出現任何其他字符(除了小數和數字),則該值不應被視爲數字。 – user3360088

+0

查看該案例的更新答案。 –