shell 正在获取“[:=:bash程序中需要一元运算符“[duplicate]

zfciruhq  于 2022-11-30  发布在  Shell
关注(0)|答案(2)|浏览(229)
    • 此问题在此处已有答案**:

When to wrap quotes around a shell variable?(5个答案)
11小时前关门了。
我一直在编写一个示例bash程序来练习bash脚本编写,但是每当我尝试使用正确的变量运行它时,它都会输出"[:=:应为一元运算符""并退出。

#! /bin/bash
clear
i=""
P="PASSWORD"
echo "Please enter your password"
while [ $i = "PASSWORD" ]
do
  read $i
done
k5hmc34c

k5hmc34c1#

如果$i为空,则会出现语法错误,因为参数不足[="PASSWORD"]
1.您可以使用bash选项$i ="PASSWORD"但它是bash操作符,可能与旧shell不兼容
1.你可以把你的变量放在配额中,比如["$i"="PASSWORD"]这是首选的方法,如果你的变量包含空格或shell扩展标记,比如 *,?,[1..9],你也可以解决这个问题。

wqnecbli

wqnecbli2#

但每当我试图使用正确的变量运行它时,它都会输出“[:=:应为一元运算符“”并退出。
这是因为在[中有一个未加引号的/空的变量,要么给变量加引号,要么使用[[,这样更安全、更健壮。
while [ $i =“密码”]
$i的值为空,用户无法提供值/输入,因此将失败
编辑:正如@William Pursell提到的,无论你使用哪种测试,它仍然有一些陷阱,这里的教训是净化/验证输入,例如测试它是否确实是一个数字,如果它不为空等等。
试试这个,它可能会做你想要的。

#!/usr/bin/env bash

clear
p="PASSWORD"
read -rp "Please enter your password: " input  ##: Ask the user to enter the password

until [[ $p == "$input" ]]; do ##: The loop will continue until both vars matches
  clear
  printf 'Please try again! %s does not match..\n' >&2 "$input"
  read -rp "Please enter your password: " input
done

##: If it matches print a message and the value of input
printf '%s is a match!\n' "$input"

相关问题