gpt4 book ai didi

linux - Bash 脚本为两个但相反的字符串测试返回 true

转载 作者:IT王子 更新时间:2023-10-29 00:32:54 27 4
gpt4 key购买 nike

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

# 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"

(试试吧!)

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

您所做的如下:

[[ $var=="" ]]

[[ $var!="" ]]

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

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

[[ $var == "" ]]

相反。现在,您的测试最好写成:

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

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

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

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

    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
}

同样如此!

关于linux - Bash 脚本为两个但相反的字符串测试返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com