bash如果大于等于错误

bash if greater than or equal to error

下面的 bash 脚本出现错误;

line 16: [: : integer expression expected 但我不明白为什么?错误在于 if [ "$(log_date)" -le "$days_in_ms" ]; then 任何人都可以帮助解释为 BASH if statements confuse me

#!/bin/bash

region="eu-west-1"
retention_days="28"
days_in_ms="$(date +%s%3N --date=-"$retention_days"+days)"

log_date () {
  aws logs describe-log-streams --region $region --log-group-name "$groups" | jq -r '.logStreams[].lastEventTimestamp' > /dev/null 2>&1
}
log_name () {
  aws logs describe-log-streams --region $region --log-group-name "$groups" | jq -r '.logStreams[].logStreamName' > /dev/null 2>&1
}

mapfile -t logGroups < <(aws logs describe-log-groups --region $region | jq -r '.logGroups[].logGroupName') > /dev/null 2>&1
for groups in "${logGroups[@]}"; do
    if [ "$(log_date)" -le "$days_in_ms" ]; then
        log_name
     fi
done

发生了什么事

注意错误消息的详细信息:

[: : integer expression expected

看到第二个:之前的空白了吗?这就是 [ 尝试操作的值,如果有一个 。它是空白的,意味着 [ 被告知根本没有数字。

举例说明其工作原理:

$ [ foo -ge 1 ]
-bash: [: foo: integer expression expected

请注意,foo 与空白处的位置相同。因此,空白值被解析为数字。


为什么会这样

您的 log_date 函数不会 return 任何输出,因为它 >/dev/null。因此,您的代码会尝试将它 return 的空字符串解析为一个数字,并且(正确地)抱怨它在需要整数的位置得到一个空字符串。

将来,运行 set -x 启用每个命令在 运行 之前的日志记录,或者在调试时使用 bash -x yourscript 调用您的脚本,以识别这些问题.