我有一個文件ut.txt
,它有一個長度爲385186字節的單個值。我使用的是下面找到該值是否是數字:在if語句中貓期間的分段錯誤(coredump)
if [[ `cat ut.txt` = +([0-9]) ]]
then
echo "Numeric"
fi
這完美的作品上更小的文件。但隨着ut.txt(385186個字節),它給了我下面的錯誤:
Segmentation Fault(coredump)
有人能提出一個方法,使這項檢查,同時避免錯誤?
我有一個文件ut.txt
,它有一個長度爲385186字節的單個值。我使用的是下面找到該值是否是數字:在if語句中貓期間的分段錯誤(coredump)
if [[ `cat ut.txt` = +([0-9]) ]]
then
echo "Numeric"
fi
這完美的作品上更小的文件。但隨着ut.txt(385186個字節),它給了我下面的錯誤:
Segmentation Fault(coredump)
有人能提出一個方法,使這項檢查,同時避免錯誤?
你有點濫用這裏反引號的功能。他們不應該處理那麼長的輸出。段錯誤不是什麼KSH應與反應,但我建議使用流版本而不是:
if egrep -q '^[0-9]+$' ut.txt
then
echo "Numeric"
fi
您可以嘗試
grep -q '[a-zA-Z]' ut.txt || echo "Numeric"
grep查找任何定義的序列([a-zA-Z]
)的,如果沒有找到你想要的東西(||
)echo
ES。
更新在你可能有其他(如非ASCII,喜歡的重音)的評論中提及人物歸類爲不是數字。
在這種情況下,你可以使用
grep -q '[^0-9]' ut.txt || echo "Numeric"
這將搜索任何其他比數字字符。
這裏的問題是,我的文件可能包含連字符法國。也可能有其他特殊符號,我可能不會提前知道。所以,我希望所有隻有數字的東西都被認爲是「NUMERIC」。如果文件中出現任何其他字符(除了小數和數字),則該值不應被視爲數字。 – user3360088
查看該案例的更新答案。 –
謝謝.. egrep肯定會幫助我在這裏(雖然我不能讓-q工作)。我考慮把值寫入一個可變的值(下面的命令中的變量'a')。你能解釋爲什麼以下幾點不適用於非常大的值?要檢查INTEGER:'[[$ a = +([0-9])]] && echo numeric'。檢查DECIMAL數字:'[[$ a = +([0-9])\。+([0-9])]] && echo float'。當使用非常大的值時,這些給我相同的「分段錯誤(coredump)」錯誤,但對於小數值運行完美。提前致謝。 – user3360088
正如我所說的,這個功能不適用於大數據,如果你使用大數據,它可能會溢出一個ksh的內部緩衝區。如果在ksh中沒有檢查這個,可能會導致段錯誤。關於'-q':你可以通過使用重定向到/ dev/null來替換:'if egrep'^ [0-9] + $'>/dev/null'。 – Alfe
如果你想允許浮動,只需使用'^ [0-9。] + $'。 – Alfe