Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将变量与grep语句进行比较_Bash - Fatal编程技术网

Bash 将变量与grep语句进行比较

Bash 将变量与grep语句进行比较,bash,Bash,当且仅当用户通过stdin输入的内容符合 [a-z_][a-z0-9_-]* 因此,如果用户要在其传递的参数中输入%或$,那么它将返回false。我怎样才能做到这一点呢?这从标准输入中读取并报告正确或错误状态(如果为错误则退出): 如果grep找到与您的正则表达式匹配的项,它会将其退出代码设置为true(0),在这种情况下执行“and”(&&&)子句并返回“true”。如果grep未能找到匹配项,则执行“or”(|)子句并返回“false”。grep的-q标志告诉grep保持安静 如果要在脚本

当且仅当用户通过stdin输入的内容符合

[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
是指literal
false
,那么您有一个小问题: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