linux – Bash Script为两个但是相反的字符串测试返回true

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

# 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是否在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.

最佳答案
为什么你总能成真?让我们先在您的终端中播放一下:

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

您认为输出是什么? (试试吧!)以下是什么?

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

(试试吧!).

好吧,所以似乎非空字符串等同于真实表达式,空字符串(或未设置变量)等同于false表达式.

你做了以下几点:

[[ $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 } ')"

>不要使用函数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
}

也会这样做!

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...