Linux 获得;[:=:bash程序中应为“一元运算符”
我一直在编写一个示例bash程序来练习bash脚本,但每当我尝试使用正确的变量运行它时,它就会输出“[:=:预期一元运算符”并退出Linux 获得;[:=:bash程序中应为“一元运算符”,linux,bash,shell,Linux,Bash,Shell,我一直在编写一个示例bash程序来练习bash脚本,但每当我尝试使用正确的变量运行它时,它就会输出“[:=:预期一元运算符”并退出 #! /bin/bash clear i="" P="PASSWORD" echo "Please enter your password" while [ $i = "PASSWORD" ] do read $i done 如果$i为空,则由于参数不够[=“PASSWORD”] 您可以使用bash选项[$i=“PASSWORD”]] 但它是bash操作符,可能与
#! /bin/bash
clear
i=""
P="PASSWORD"
echo "Please enter your password"
while [ $i = "PASSWORD" ]
do
read $i
done
如果$i为空,则由于参数不够[=“PASSWORD”]
如果$i为空,则由于参数不够[=“PASSWORD”]
[
中有一个不带引号的/空变量,要么引用变量,要么使用更安全、更健壮的[[
而[$i=“密码”]
$i
的值为空用户无法提供值/输入,因此将失败
编辑:正如
@William Pursell
所述,无论您使用哪种测试,它仍然存在一些缺陷,这里的课程是清理/验证输入,例如,测试它是否确实是数字,是否不是空的等等
试试这个,它可能会做你想做的
!/usr/bin/env bash
清楚的
p=“密码”
阅读-rp“请输入密码:”输入##:要求用户输入密码
直到[[$p==“$input”]];do##:循环将继续,直到两个变量匹配为止
清楚的
printf'请重试!%s不匹配..\n'>&2“$input”
阅读-rp“请输入您的密码:”输入
完成
##:如果匹配,则打印消息和输入值
printf“%s”是匹配项!\n'$input“
但每当我尝试使用正确的变量运行它时,它就会输出“[:=:预期的一元运算符”并退出
这是因为在[
中有一个不带引号的/空变量,要么引用变量,要么使用更安全、更健壮的[[
而[$i=“密码”]
$i
的值为空用户无法提供值/输入,因此将失败
编辑:正如
@William Pursell
所述,无论您使用哪种测试,它仍然存在一些缺陷,这里的课程是清理/验证输入,例如,测试它是否确实是数字,是否不是空的等等
试试这个,它可能会做你想做的
!/usr/bin/env bash
清楚的
p=“密码”
阅读-rp“请输入密码:”输入##:要求用户输入密码
直到[[$p==“$input”]];do##:循环将继续,直到两个变量匹配为止
清楚的
printf'请重试!%s不匹配..\n'>&2“$input”
阅读-rp“请输入您的密码:”输入
完成
##:如果匹配,则打印消息和输入值
printf“%s”是匹配项!\n'$input“
在bash中使用[[[
以避免更多的意外和更少的错误…对于初学者,在的中加上$i左右的引号,然后在读取片段的$i
中删除$FYI。FYI自动检测这些和其他常见问题suse[[
在bash中,为了避免更多的意外和更少的bug……对于初学者来说,在测试时在$i周围加上引号,并从读取片段中的$i
中删除$FYI,自动检测这些和其他常见问题考虑i=foo;[[i-gt 0]]
一个健壮的运算符会报告一个错误,即您试图将整数比较运算符与非整数字符串一起使用。[[
与test
有不同的陷阱,如果您不理解这些陷阱,就不应该使用它们。好的,谢谢您的精彩评论。我将更新我的答案。[[$输入==$p] ] /<代码>是不安全的,因为如果<代码> $p/COD>包含任何GLUB(通配符)字符,它将被视为一种模式,而不是仅仅作为文字字符串进行比较。请考虑<代码> I= Foo;[[I-GT 0 ] ]。
一个健壮的运算符会报告一个错误,即您试图将整数比较运算符与非整数字符串一起使用。[[
与test
有不同的陷阱,如果您不理解这些陷阱,就不应该使用它们。好的,谢谢您的精彩评论。我将更新我的答案。[[$input==$p]]
是不安全的,因为如果$p
包含任何全局(通配符)字符,它将被视为一种模式,而不仅仅是作为一个文本字符串进行比较。就我个人而言,我更喜欢总是双引号变量引用(即使在像[]
中的大多数用法那样安全的地方),除非有特定的理由不使用双引号。这样我就不用再去想那些不安全的情况了。例如,你知道吗,在[[“$a”=“$b”]]
测试中,不使用左引号($a
)是安全的,但不使用右引号($b
)更改测试的含义?(不带引号,它将把$b
视为全局模式而不是普通字符串。)就我个人而言,我更喜欢总是双引号引用变量引用(即使在[[]]
中的大多数用法都可以安全地将它们去掉的地方),除非有特别的理由不重复引用。这样就省去了我记所有的错误