Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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

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
Linux 获得;[:=:bash程序中应为“一元运算符”_Linux_Bash_Shell - Fatal编程技术网

Linux 获得;[:=: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操作符,可能与

我一直在编写一个示例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操作符,可能与旧shell不兼容

  • 您可以将变量放入配额中,如[“$i”=“PASSWORD”] 这是首选,如果变量包含空格或shell扩展标记,如*,?,[1..9],您还将解决一个问题


  • 如果$i为空,则由于参数不够[=“PASSWORD”]

  • 您可以使用bash选项[$i=“PASSWORD”]] 但它是bash操作符,可能与旧shell不兼容

  • 您可以将变量放入配额中,如[“$i”=“PASSWORD”] 这是首选,如果变量包含空格或shell扩展标记,如*,?,[1..9],您还将解决一个问题

  • 但每当我尝试使用正确的变量运行它时,它就会输出“[:=:预期的一元运算符”并退出

    这是因为在
    [
    中有一个不带引号的/空变量,要么引用变量,要么使用更安全、更健壮的
    [[

    而[$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
    视为全局模式而不是普通字符串。)就我个人而言,我更喜欢总是双引号引用变量引用(即使在
    [[]]
    中的大多数用法都可以安全地将它们去掉的地方),除非有特别的理由不重复引用。这样就省去了我记所有的错误