将变量与grep语句进行比较

时间:2014-03-24 01:23:24

标签: bash

我正在尝试将语句传递为true,当且仅当用户通过stdin输入时才在

的指导范围内
[a-z_][a-z0-9_-]*

因此,如果用户在传递的参数中输入%或$,则返回false。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

这从stdin读取并报告真或假状态(如果它是假则退出):

grep -q '^[a-z_][a-z0-9_-]*$' && echo true || { echo false; exit 1 ; }

如果grep找到与正则表达式匹配的值,则将其退出代码设置为true(0),在这种情况下执行“and”(&&)子句并返回“true”。如果grep找不到匹配项,则执行“或”(||)子句并返回“false”。 -q的{​​{1}}标记告诉grep安静。

如果要在脚本中使用它,可能需要将用户输入捕获到shell变量中,然后对其进行测试。这可能看起来像:

grep

如果结果是“true”,为了便于添加更多语句来执行,我们可以用更长的形式写出来,并标记一个地方以添加更多语句:

read -p "Enter a name: " var
echo "$var" | grep -q '^[a-z_][a-z0-9_-]*$' && echo true || { echo false; exit 1 ; }

答案 1 :(得分:2)

答案取决于return的含义。如果按return表示文字false,那么,您遇到一个小问题:UNIX脚本只能 返回0-255范围内的整数。通常在UNIX中,当程序返回时,它返回一个退出状态,指示(among other things)程序的成功或失败。所以你可以写:

grep -q ''^[a-z_][a-z0-9_-]*' || exit

在脚本的顶部。由于shell脚本以$?的最后一个值退出,因此仅在grep失败时退出,并且将以与grep语句本身相同的退出代码退出。从技术上讲,这意味着返回1,但在UNIX中类似于false。如果grep成功,脚本将继续,在完成或发生其他错误情况之前不返回任何内容。

如果您真正想要的是打印字符串"false",请参阅John1024's answer