在命令参数中注入 bash 条件

Inject bash condition in command parameter

我想执行一个命令,将逻辑操作的结果作为参数注入。 基本上,条件充当三元运算符 $VAR ? 40 : 30,结果设置为参数

当$VAR为'true'时需要执行以下命令: pytest --cov-fail-under=40

我试过

pytest --cov-fail-under=${[[ $VAR = 'true' ]] && 40 || 80} tests/

但我得到了一个错误替换错误

bash有一个三元运算符,但是只能用在算术表达式中,所以在比较字符串的时候不能用。

您需要设置一个变量,然后替换它。

if [[ $VAR = true ]]
then fail_under=40
else fail_under=80
fi
pytest --cov-fail-under="$fail_under" tests/

您可以输出值。

pytest --cov-fail-under=$(if [[ $VAR = 'true' ]]; then echo 40; else echo 80; fi) tests/

您还可以扩展 pytest 并自定义设置 cov_fail_under 值。在您的项目或测试根目录中创建一个 conftest.py 文件,内容如下:

import os
import pytest


@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
    cov_plugin = config.pluginmanager.get_plugin("_cov")
    var = os.environ.get("VAR", None)
    # allow user to override the value from command line by passing `--cov-fail-under=x`
    if cov_plugin is not None and config.option.cov_fail_under is None:
        value = 40 if var == "true" else 30
        cov_plugin.options.cov_fail_under = value

现在运行例如

$ export VAR=true
$ pytest --cov=stuff

将自动应用 cov_fail_under = 40,而 运行 VAR 未设置或 VAR=false 将使用 30 作为默认值。要使用 x 覆盖该值,请显式传递 --cov-fail-under=x

您的 bash 代码段有两个问题:

第一个问题:${}是指定变量名的语法。换句话说,${something} === $something

第二个问题:&&||后面必须跟一个命令。 [[ $VAR = 'true' ]] && 40 表示“如果 $VAR 是 'true' 执行 命令 40.

所以你的台词应该是这样的:

pytest --cov-fail-under=$([[ $VAR = 'true' ]] && echo 40 || echo 80) tests/

bash 中的三元运算符仅适用于 (( )) 且仅适用于数值。

(此外,这与 pytest 本身无关;我正在删除该标签。)