Bash脚本对于两个但是相反的字符串测试都返回true

Ran*_*awa 5 linux bash ubuntu boolean-logic centos

在我运行我输入的脚本之前

# export CPIC_MAX_CONV=500
Run Code Online (Sandbox Code Playgroud)

以下是test1.script文件

#!/bin/bash

function cpic () {
  var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
  [[ $var=="" ]] && (echo "Empty String <<")
  [[ $var!="" ]] && (echo "$CPIC_MAX_CONV")
  echo "$var" ;
}

cpic
Run Code Online (Sandbox Code Playgroud)

输出是:

# test1.script  ---- Me running the file

Empty String <<
500
CPIC_MAX_CONV="500"
Run Code Online (Sandbox Code Playgroud)

无论我使用什么""或""或[或[结果是相同的.该CPIC_MAX_CONV变量由上述脚本找到.

我在Linux/CentOS 6.3上运行它.

这个想法很简单:找到是否CPIC_MAX_CONV在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.

gni*_*urf 4

为什么你总是说实话?让我们先在终端上玩一下:

\n\n
$ [[ hello ]] && echo "True"\n
Run Code Online (Sandbox Code Playgroud)\n\n

你认为输出是什么?(尝试一下!)下面的内容呢?

\n\n
$ [[ "" ]] && echo "True"\n
Run Code Online (Sandbox Code Playgroud)\n\n

(尝试一下!)。

\n\n

好吧,看来非空字符串相当于 true 表达式,空字符串(或未设置的变量)相当于 false 表达式。

\n\n

您所做的如下:

\n\n
[[ $var=="" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
[[ $var!="" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以你给出了一个非空字符串,这是真的!

\n\n

为了执行测试,您实际上需要在标记之间留有空格:

\n\n
[[ $var == "" ]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

反而。现在,您的测试最好写为:

\n\n
if [[ -z "$var" ]]; then\n    echo "Empty String <<"\nelse\n    echo "$CPIC_MAX_CONV"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

(没有子 shell,并且只有一项测试)。

\n\n

关于您的脚本风格还有更多要说的。无意冒犯,我想说这真的很糟糕:

\n\n
    \n
  • 不要使用反引号!请改用该$(...)构造。因此:

    \n\n
    var="$(export | grep -i "CPIC_MAX_CONV" | awk \'/CPIC_MAX_CONV/ { print $NF } \')"\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 不要用来function blah定义函数。您的函数应该定义为:

    \n\n
    cpic () {\n    local var="$(export | grep -i "CPIC_MAX_CONV" | awk \'/CPIC_MAX_CONV/ { print $NF } \')"\n    if [[ -z "$var" ]]; then\n        echo "Empty String <<"\n    else\n        echo "$CPIC_MAX_CONV"\n    fi\n}\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

哦,我使用了local关键字,因为我猜你不会var在函数之外使用变量cpic

\n\n

现在,该函数的目的是什么cpic,特别是您定义变量的目的是什么var?这很难描述(因为有很多你没有想到的情况)。(顺便说一句,你grep在这里似乎真的没用)。以下是一些你忽略的情况:

\n\n
    \n
  • 导出的变量被命名为somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
  • \n
  • 导出的变量在某处包含字符串CPIC_MAX_CONV,例如,

    \n\n
    export a_cool_variable="I want to screw up Randhawa\'s script and just for that, let\'s write CPIC_MAX_CONV somewhere here"\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

好吧,我不想描述你的行到底在做什么,但我猜你的目的是知道变量是否已CPIC_MAX_CONV设置并标记为导出,对吧?在这种情况下,你最好这样做:

\n\n
cpic () {\n    if declare -x | grep -q \'^declare -x CPIC_MAX_CONV=\'; then\n        echo "Empty String <<"\n    else\n        echo "$CPIC_MAX_CONV"\n    fi\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它将更加高效、更加稳健。

\n\n

哦,我现在正在读你文章的结尾。如果您只想判断变量是否CPIC_MAX_CONV已设置(某些非空值 \xe2\x80\x94 ,似乎您不关心它是否被标记为导出,如果我错了,请纠正我) ),它甚至更简单(而且效率会高得多):

\n\n
cpic () {\n    if [[ "$CPIC_MAX_CONV" ]]; then\n        echo "Empty String <<"\n    else\n        echo "$CPIC_MAX_CONV"\n    fi\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

也会做的!

\n