Bash 将变量与grep语句进行比较
当且仅当用户通过stdin输入的内容符合Bash 将变量与grep语句进行比较,bash,Bash,当且仅当用户通过stdin输入的内容符合 [a-z_][a-z0-9_-]* 因此,如果用户要在其传递的参数中输入%或$,那么它将返回false。我怎样才能做到这一点呢?这从标准输入中读取并报告正确或错误状态(如果为错误则退出): 如果grep找到与您的正则表达式匹配的项,它会将其退出代码设置为true(0),在这种情况下执行“and”(&&&)子句并返回“true”。如果grep未能找到匹配项,则执行“or”(|)子句并返回“false”。grep的-q标志告诉grep保持安静 如果要在脚本
[a-z_][a-z0-9_-]*
因此,如果用户要在其传递的参数中输入%或$,那么它将返回false。我怎样才能做到这一点呢?这从标准输入中读取并报告正确或错误状态(如果为错误则退出): 如果
grep
找到与您的正则表达式匹配的项,它会将其退出代码设置为true(0),在这种情况下执行“and”(&&&
)子句并返回“true”。如果grep
未能找到匹配项,则执行“or”(|
)子句并返回“false”。grep
的-q
标志告诉grep
保持安静
如果要在脚本中使用它,可能需要将用户输入捕获到shell变量中,然后对其进行测试。这可能看起来像:
read -p "Enter a name: " var
echo "$var" | grep -q '^[a-z_][a-z0-9_-]*$' && echo true || { echo false; exit 1 ; }
为了便于在结果为“true”时添加更多要执行的语句,我们可以用更长的形式写出它,并标记一个位置以添加更多语句:
read -p "Enter a name: " var
if echo "$var" | grep -q '^[a-z_][a-z0-9_-]*$'
then
echo true
# other statements to execute if true go here
else
echo false
exit 1
fi
答案取决于您所说的
return
是什么意思。如果您所说的return
是指literalfalse
,那么您有一个小问题:UNIX脚本只能返回0-255范围内的整数。通常在UNIX中,当程序返回时,它返回一个退出状态,指示()程序的成功或失败。所以你可以写:
grep -q ''^[a-z_][a-z0-9_-]*' || exit
在脚本的顶部。由于shell脚本以最后一个值$?
退出,因此只有当grep
失败时才会退出,并且将以与grep
语句本身相同的退出代码退出。从技术上讲,这意味着返回1
,但在UNIX中这类似于false
。如果grep
成功,脚本将继续,直到完成或出现另一个错误情况时才会返回任何内容
如果您真正想要的是打印字符串
“false”
,请参见。考虑grep-q
,而不是重定向到/dev/null
。-q
标志是@kojiro好建议的一部分。完成。+1犹豫地投票表决。我仍然不确定OP是否要打印字符串“false”或“true”或实际返回值。如果我键入了超出参数范围的内容,例如test%,则返回为true。我还需要它退出,如果它是false@user2860658我添加了代码,如果为false,也可以退出。我将答案中的代码复制回shell,然后尝试“text%”,结果返回false。在正则表达式前面加上^
和后面加上$
非常重要,因为这样可以确保整个输入必须与正则表达式匹配,而不仅仅是部分匹配。如果它继续给你带来问题,让我有更多的细节。
grep -q ''^[a-z_][a-z0-9_-]*' || exit