我正在尝试将语句传递为true,当且仅当用户通过stdin输入时才在
的指导范围内[a-z_][a-z0-9_-]*
因此,如果用户在传递的参数中输入%或$,则返回false。我怎么能这样做?
答案 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。