2014-02-27 20 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

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