用户名和密码登录循环bash

用户名和密码登录循环bash,bash,while-loop,grep,Bash,While Loop,Grep,虽然if语句也会启动循环,但这毫无意义,但我对bash非常陌生,所以很多事情对我来说都没有意义 first=0 echo enter your username read user log1=$(grep -q $user username_pass.txt) echo enter your password read pass log2=$(grep -q $pass username_pass.txt ) if [ $log1=0 ] && [ $log2=0 ]; th

虽然if语句也会启动循环,但这毫无意义,但我对bash非常陌生,所以很多事情对我来说都没有意义

first=0
echo enter your username
read user
log1=$(grep -q $user username_pass.txt)

echo enter your password
read pass
log2=$(grep -q $pass username_pass.txt )

if [ $log1=0 ] && [ $log2=0 ];
then
    echo Welcome
    first=1
fi 

while [ $log1=1 ] || [ $log2=1 ];
do 
    echo wrong user name or password
    echo enter your username
    read user
    echo enter your password
    read pass
done

if [ $log1=0 ] && [ $log2=0 ] && [ first=0 ];
then
    echo Welcome
fi

[…]
在shell中不是特别特殊的语法。您正在将参数
$log1=0
]
传递给名为
[
的命令,该命令从其参数中删除
]
,并将其余参数传递给
测试。假设
$log1
包含“用户名”,结果是:

test 'username=0'
test
获取一个参数时,它会检查该参数是否为非空字符串
$log1=0
永远不会是空字符串

您真正需要的是将运算符和操作数作为单独的参数传递,如下所示:

if [ "$log1" = 0 ] && [ "$log2" = 0 ]; then
请注意引号,它阻止将
$log1
扩展为多个参数

如果您将退出代码与一个数字(在运行命令后为
$?
)进行比较,您可能还想从
grep
获取退出代码,而不是输出:

grep -q "$user" username_pass.txt
log1=$?
为了便于使用,您还可以将其拆分为一个函数

test_credentials() {
    grep -q "$1" username_pass.txt || return 1
    grep -q "$2" username_pass.txt || return 1
}

if test_credentials "$user" "$pass"; then
    …

您可能还想重新考虑如何检查凭据。对同一个文件进行两次grepping可能会有很多问题,但有一个问题是您可以使用用户名作为密码登录。

哪个
if
语句?你的问题不清楚。这是重复的,不是重复的,而是代码不同部分的不同问题我有一个文件,有两列,一列是用户名,另一列是密码,它们由用户在代码的不同部分输入,未显示,我需要它,以便它检查他们输入的用户名和密码是否与名为username\u pass的文件中的任何用户名和密码匹配。txt@AdrianFall:太好了!还有?有没有办法使用awk查找用户名的位置,并检查第二个输入是否与该行第二列中的密码匹配?