【问题标题】:Bash - define a variable value with sed and extract with if conditionBash - 使用 sed 定义变量值并使用 if 条件提取
【发布时间】:2022-01-12 21:30:12
【问题描述】:

我一直在努力用 sed 定义变量值,将值与“6.7”进行比较,然后写入文件。

这个值是一个版本,所以它总是一个 int 或一个 double。但是我的代码似乎不起作用:

FILE="user/gradle-6.7-new"
VERSION=$(sed -n '/^distributionUrl=/s/.*gradle-\([^-]*\)-.*/\1/p' $FILE)
if [[ $VERSION > 6.7 ]]
then
  $VERSION > /tmp/version_file
fi

谢谢。

【问题讨论】:

  • 你能在文件中添加包含版本的行吗?
  • @Fravadona 这是$FILE 变量
  • shellcheck.net查看你的代码,你会看到原因
  • @Fravadona Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.^-- SC2072 (error): Decimals are not supported. Either use integers only, or use bc or awk to compare. 我认为这与我无关。如果您发现有问题,能否提出更改建议?
  • Bash、sh 还是 shell?请阅读相应标签的说明!

标签: bash shell sh


【解决方案1】:

awk 可能是更简单的方法。

#!/usr/bin/env bash
FILE="user/gradle-6.7-new"
awk -F- '{version=$2} version >= 6.7 { print version > "/tmp/version_file" }' <<< $FILE

【讨论】:

  • 谢谢。 if 语句似乎不起作用。没有任何东西被写入/tmp/version_file
  • 真正的问题不在于sed 命令。 OP 想要检查 $VERSION(可能类似于 6.9.8)是否大于 6.7
  • @HatLess 是的,我也在本地进行了测试。 @M.NejatAydin 我也可以只使用“单点版本比较”,例如 6.76.9。但这不适用于我尝试使用 FILE="user/gradle-6.9-new" 的 mw 我希望 6.9 被打印到 /tmp/version_file 但那里什么都没有
  • @M.NejatAydin 谢谢,我完全错过了
  • @HatLess 我现在得到的输出是6.7/tmp/version_file
【解决方案2】:

假设:

  • OP 的当前代码正确填充 VERSION(即,我假设 OP 从 $FILE 填充 VERSION 没有问题)

我建议查看@this link 的答案。

虽然没有被选为接受的答案,但this answer 的变体相对简单,即让sort/-V 订购两个版本字符串进行比较,然后测试第一个(或最后)sort/-V 输出相应的行,例如:

testVERSION='6.7'

for VERSION in 6.6 6.7 6.7.0 6.7.1 6.71
do
    op='<'
    if [[ $(printf "%s\n%s\n" "${testVERSION}" "${VERSION}" | sort -V | head -1) == "${testVERSION}" ]]
    then
        op='='    # at this point we know ${VERSION} >= ${testVERSION}, but assuming OP needs to distinguish between '>=' and '>' we need one more test ...

        [[ "${VERSION}" != "${testVERSION}" ]] && op='>'
    fi
    echo "${VERSION} ${op} ${testVERSION}"
done

这会生成:

6.6 < 6.7
6.7 = 6.7
6.7.0 > 6.7
6.7.1 > 6.7
6.71 > 6.7

从这里 OP 应该能够调整逻辑以生成所需的结果,例如:

testVERSION='6.7'

[[ $(printf "%s\n%s\n" "${testVERSION}" "${VERSION}" | sort -V | head -1) == "${testVERSION}" ]] &&
[[ "${VERSION}" != "${testVERSION}" ]] &&
echo "$VERSION" > /tmp/version_file           # we get this far if ${VERSION} > ${testVERSION}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2019-10-03
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多