【发布时间】:2011-01-13 16:46:28
【问题描述】:
我正在尝试做一些足够常见的事情:在 shell 脚本中解析用户输入。如果用户提供了一个有效的整数,脚本会做一件事,如果无效,它会做另一件事。麻烦的是,我还没有找到一种简单(而且相当优雅)的方式来做到这一点——我不想一个个一个字符地把它分开。
我知道这一定很容易,但我不知道怎么做。我可以用十几种语言做到这一点,但 BASH 不行!
在我的研究中,我发现了这个:
Regular expression to test whether a string consists of a valid real number in base 10
其中有一个关于正则表达式的答案,但据我所知,这是 C (以及其他)中可用的函数。尽管如此,它看起来还是一个很好的答案,所以我用 grep 尝试了它,但 grep 不知道如何处理它。我尝试了 -P ,它在我的盒子上意味着将其视为 PERL 正则表达式 - nada。破折号 E (-E) 也不起作用。 -F 也没有。
为了清楚起见,我正在尝试这样的事情,寻找任何输出 - 从那里,我将破解脚本以利用我得到的任何东西。 (IOW,我期待一个不符合要求的输入在重复有效行时不会返回任何内容。)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
谁能说明这是最容易做到的吗?
坦率地说,在我看来,这是 TEST 的一个缺点。它应该有这样的标志
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
【问题讨论】:
-
仅供参考:
[与旧版本兼容test;[[是 Bash 的新东西,有更多的操作和不同的引用规则。如果您已经决定坚持使用 Bash,请选择[[(它真的好多了);如果您需要移植到其他 shell,请完全避免使用[[。
标签: string bash if-statement integer