linux - test - shell字符串比较




Bash Script对两个字符串测试都是正确的 (3)

你为什么总是变得真实? 先在你的终端上玩一下:

$ [[ hello ]] && echo "True"

你认为输出是什么? (尝试一下!)和以下?

$ [[ "" ]] && echo "True"

(尝试一下!)。

好的,所以看起来非空字符串等同于真正的表达式,而空字符串(或未设置的变量)相当于假表达式。

你做了什么是以下几点:

[[ $var=="" ]]

[[ $var!="" ]]

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

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

[[ $var == "" ]]

代替。 现在,你的测试会写得更好:

if [[ -z "$var" ]]; then
    echo "Empty String <<"
else
    echo "$CPIC_MAX_CONV"
fi

(没有子壳,只有一个测试)。

还有更多关于你的脚本风格的说法。 没有冒犯,我会说这真的很糟糕:

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

    var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
  • 不要用function blah来定义一个函数。 你的函数应该被定义为:

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

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

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

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

    export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here"

好吧,我不想描述你的线路正在做什么,但我猜你的目的是要知道变量CPIC_MAX_CONV是否被设置和标记为导出,对不对? 在这种情况下,你最好这样做:

cpic () {
    if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then
        echo "Empty String <<"
    else
        echo "$CPIC_MAX_CONV"
    fi
}

它会更有效率,更健壮。

哦,我现在只是读你的帖子的结尾。 如果你想告诉变量CPIC_MAX_CONV是否被设置(某些非空值 - 你不关心它是否被标记为导出,纠正我,如果我错了),它更简单(它会效率要高得多):

cpic () {
    if [[ "$CPIC_MAX_CONV" ]]; then
        echo "Empty String <<"
    else
        echo "$CPIC_MAX_CONV"
    fi
}

也会做的!

在我运行脚本之前,我已经进入了

# export CPIC_MAX_CONV=500

以下是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

输出是:

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

Empty String <<
500
CPIC_MAX_CONV="500"

不管我用什么“”或“”或[或[[结果是一样的。 CPIC_MAX_CONV变量是由上面的脚本找到的。

我在Linux / CentOS 6.3上运行这个。

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


你需要空间在你的条件。

#!/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

你真的关心CPIC_MAX_CONV是否是一个环境变量而不是“它是一个变量可能是一个环境变量”? 最有可能的是,你不会,因为如果它是一个变量而不是一个环境变量,你运行的任何脚本将看不到该值(但如果你坚持使用别名和函数,那么它可能很重要,但仍然可能不会)。

那么看来,你正试图测试CPIC_MAX_CONV是否被设置为非空值。 有很多简单的方法可以做到这一点 - 然后就是你尝试的方式。

: ${CPIC_MAX_CONV:=500}

这确保CPIC_MAX_CONV被设置为非空值; 如果以前没有设置值,则使用500。 :冒号)命令评估它的参数并报告成功。 如果想要export CPIC_MAX_CONV可以安排在创建后导出变量。

如果你必须有变量集(没有合适的默认值),那么你使用:

: ${CPIC_MAX_CONV:?}

要么

: ${CPIC_MAX_CONV:?'The CPIC_MAX_CONV variable is not set but must be set'}

区别在于您可以使用默认消息('CPIC_MAX_CONV:参数为null或未设置')或指定您自己的。

如果你只打算使用一次这个值,你可以在一个命令中进行一个“实时”替换:

cpic_command -c ${CPIC_MAX_CONV:-500} ...

这不会创建变量,如果它不存在,那么不同于:= notation。

在所有这些符号中,我一直使用冒号作为操作的一部分。 这强制“空或不设置”; 你可以省略冒号,但是允许一个空字符串作为有效值,这可能不是你想要的。 请注意,由空白组成的字符串不是空的。 如果你需要验证你有一个非空字符串,你必须努力工作一点。

我并没有解剖你滥用[[ command; gniourf_gniourf提供了一个很好的解构 ,但忽略了可以做的似乎是工作的简单的符号。





boolean-logic