如何判断 Tasker 变量是未设置、空字符串还是非空字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断 Tasker 变量是未设置、空字符串还是非空字符串相关的知识,希望对你有一定的参考价值。

参考技术A

要判断剪贴板变量 %CLIP 是否为非空值,一般会通过 %CLIP 是否等于 %CLIP 来判断,但如果当前剪贴板的内容为 %CLIP ,那这种方法会将变量 %CLIP 误判为空值。

为了准确地判断出变量是否为非空值,本文提供了两种可行的判断方法。

对 Tasker 变量比较了解的用户应该知道,在绝大多数的动作(Actions)中,当变量(%str)处于以下三种状态时:

1. 未设置
2. 空字符串(%str = %null())
3. 其值等于变量名(%str = %str)

变量 %str 的值都是 %str 。因此,要判断出变量到底是未设置、空字符串还是非空字符串,关键在于如何区分第 2 和 第 3 种状态(在 Tasker 中,这两种都属于已设置状态)。

下面将列出判断的步骤:

1. 首先,判断变量 %str 的值是否等于 %str ,若等于,将继续往下判断;若不等于,可知变量 %str 为 非空字符串
2. 接着判断变量 %str 的值是否已设置,若等于,再继续往下判断;若不等于,可知变量 %str 为 未设置

第 3 步,是对上面提及的两种状态进行区分,方法有二,一种是适用于所有 Tasker 变量的 javascript 法,另一种则是「变量搜索替换」法,但仅适用于用户自建变量。

这两种方法的优缺点:

如何测试“二进制”或未设置的 char*?

【中文标题】如何测试“二进制”或未设置的 char*?【英文标题】:How to test a "binary" or unset char*? 【发布时间】:2013-10-19 19:48:15 【问题描述】:

编辑:添加了一些对问题条件有很大变化的精度,请注意在判断答案之前。

我在const char* 表单下获得了一个环境变量。环境变量可以是

未设置(我的意思是未设置,例如,如果环境变量取自批处理环境,set MyBinaryEnvVar=) 设置为 0 设置为 1

因此,const char* 形式将是

"" “0” “1”

我想用一个单行来测试它,未设置和“0”未通过测试,“1”通过它。所以像:

if(getEnvVar("MyBinaryEnvVar")) dontWorry();
else beHappy();

getEnvVar 返回一个 const char* 。

在 VisualStudio 2010 上的测试表明 envVar 的三个值通过了测试,所以 if("") if("0") if("1") TRUE

谢谢

【问题讨论】:

您在寻找ternary operator 吗? 究竟什么是“未设置”?空字符串还是别的什么? @CookieOfFortune 也许,我也不知道它在 char* 上的确切行为 @jrok 问题已更新 我认为至少可以保留一个通用的、有用的信息,那就是如果非空 char* 为真。我认为如果我问起来,我会得到几个下降:p 【参考方案1】:

有关字符串比较,请参阅strcmp()getenv() 返回的所有值都是字符串。您只需要一个if 声明。

请注意,您的逻辑错过了“其他”情况(当值真正未设置时(即getenv() 返回NULL)或者它不是上述 3 个值。

【讨论】:

我会推荐至少更安全的版本strncmp() 或使用std::string,因为OP 要求c++。 我不能使用 strcmp(公司限制) 我的 getenv 不返回字符串,而是返回 const char,如所示。我正在澄清问题中的 Unset/null 案例,谢谢 @Kharski const char* 是 C 风格的字符串。还是您的意思是const char(返回单个char 是一种奇怪的方式)? @simonc 是 C 风格的字符串。如果您认为我应该重新标记为 C 而不是 C++,请添加一个带有理由的 meta.SO 链接,我会这样做。【参考方案2】:

假设getEnvVar 可以为未设置的值返回 NULL,那么您无法有效地同时检查 NULL 并在一行中比较一个值。

假设您会做很多这样的事情并想要一种简洁的方式,您可以将这两个操作委托给一个新函数并将其作为单线调用:

bool isVarSet(const char* var)

    const char* val = getEnvVar("MyBinaryEnvVar");
    if (val != NULL && strcmp(val, "1") == 0) 
        return true;
    
    return false;


if(isVarSet("MyBinaryEnvVar")) dontWorry();
else beHappy();

另一方面,如果getEnvVar 为未设置的值返回一个空字符串"",您可以这样做

if(strcmp(getEnvVar("MyBinaryEnvVar"), "1") == 0) dontWorry();
else beHappy();

【讨论】:

目前最好的答案。对于第二部分,我不能使用 strcmp 验证你的答案,我必须找到一个等效的 strcmp。 @Kharski 很高兴答案很有帮助。您能否确认您无法使用strcmp 的原因?如果需要,编写自己的版本将是微不足道的,但我正在努力思考可以有效禁止所有使用 C 标准库的公司政策...... 别再想了! Dassault Systemes,是的,是的,法国最大的软件编辑器。我要辞职了,明天正常。但我不得不说,普遍禁止所有第三方软件确实有一个很好的理由:你依赖别人。他们可以更改他们的许可,破坏他们的代码等。虽然我不明白为什么他们不能坚持使用旧版本,但在这些情况下,如果依赖项很有可能完美无缺,这是可以的,就像标准库。但在实践中,很多内部开发的东西都不是很好,有时根本就没有。 strcmp 并不是真正的第三方软件。它是 C 标准库的一部分,它本身随您的操作系统和/或编译器一起提供。您的(不久前的)雇主必须编写自己的包含标准库的 OS+编译器,或者使用包含标准库实现的第三方版本。换句话说,如果你可以打电话给malloc,我还以为你可以打电话给strcmp

以上是关于如何判断 Tasker 变量是未设置、空字符串还是非空字符串的主要内容,如果未能解决你的问题,请参考以下文章

js中如何判断字符串为空字符串?

添加字符判断是否为回文串

【SQL】表中的空字符串与NULL中的区别何在

如何判断字符串为空

sql 数据库 NULL 和 空字符串的区别

Freemarker - 将变量名设置和获取为空字符串