使用下面的bash脚本我收到错误;
line 16: [: : integer expression expected
但我无法弄明白为什么?错误在于if [ "$(log_date)" -le "$days_in_ms" ]; then
任何人都可以提供帮助并解释为BASH if语句让我感到困惑
#!/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
答案 0 :(得分:3)
请注意错误消息的详细信息:
[: : integer expression expected
在第二个:
之前看到空白?这就是[
尝试操作的值,如果有一个。它是空白的,意味着[
被告知某个数字根本不存在。
提供一个如何工作的例子:
$ [ foo -ge 1 ]
-bash: [: foo: integer expression expected
请注意,foo
位于您有空白的相同位置。因此,空值被解析为数字。
由于log_date
,>/dev/null
函数不会返回任何输出。因此,您的代码尝试解析它返回的空字符串作为数字,并且(正确地)抱怨它在一个预期整数的位置得到一个空字符串。
将来,运行set -x
以在每个命令运行之前启用它们,或者在调试时使用bash -x yourscript
调用脚本来识别这些问题。