Bash字符串长度检查 - [::预期的整数表达式

时间:2015-04-22 18:45:00

标签: bash shell

我正在尝试在systemd单元文件中执行以下操作。我在这里面临两个问题

  1. publicIPAddress可能是空字符串,因此我认为ipLength应为零,这不应该导致[::整数表达式预期错误,但我收到错误。

  2. ipLength似乎每次都是空的,即使对于publicIPAddress的有效值也是如此。我错过了什么吗?

  3. /bin/bash -c '\
                  ENV="/etc/environment"; \
                  touch $ENV; \
                  if [ $? -ne 0 ]; then  \
                     echo "****** Could not modify $ENV .. Exiting .."; \
                     exit 1; \
                  fi; \
                  while true; do \
                     publicIPAddress=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4); \
                     ipLength=${#publicIPAddress}; \
                     echo "************************************$ipLength..."; \
                     if [ "$ipLength" -gt 0 ]; then  \
                      echo "************************************ HURAHHHHHH  .."; \
                      break; \
                     fi; \
                     sleep 1; \
                  done'
    

    / bin / bash -xc的输出

    Apr 22 19:20:27 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: ++ curl -s http://169.254.169.254/latest/meta-data/public-ipv4
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: + publicIPAddress=10.1.2.3
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: + ipLength=
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: + echo '************************************...'
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: ************************************...
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: + '[' '' -gt 0 ']'
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: /bin/bash: line 0: [: : integer expression expected
    Apr 22 19:20:28 coreosextc-cluster-ws-machine-crgdulh4xle4.novalocal bash[3640]: + sleep 1
    

2 个答案:

答案 0 :(得分:1)

事实证明,这里的问题是这个脚本被嵌入到系统单元文件中。

似乎systemd本身理解${var}扩展,并且在脚本看到它之前正在扩展${#publicIPAddress}

使用另一个$转义$将保护它免受systemd这样做。

所以使用

ipLength=$${#publicIPAddress};

而不是

ipLength=${#publicIPAddress};

在剧本中。

答案 1 :(得分:0)

在if语句中删除 ipLength 变量周围的" (双引号)。

然后它会工作 - 或者如果你想使用引号,那么不要使用 -eq ,而是使用 ==" 0"

我还建议使用2个大括号而不是单个

if [[ $ipLength -eq 0 ]]; then echo giga; else echo koba; fi 

......或......

if [[ "$ipLength" == "0" ]]; then echo Hurra -- ipLength=0 ; else echo ipLength=$ipLength; fi

例如:

[c1000@s10 giga]$ a=; if [ "$a" -eq 0 ]; then echo giga; else echo koba; fi
-bash: [: : integer expression expected
koba
[c1000@s10 giga]$ a=''; if [ "$a" -eq 0 ]; then echo giga; else echo koba; fi
-bash: [: : integer expression expected
koba
[c1000@s10 giga]$ a=""; if [ "$a" -eq 0 ]; then echo giga; else echo koba; fi
-bash: [: : integer expression expected
koba
[c1000@s10 giga]$

[c4000@s10 giga]$ a="1"; if [ "$a" -eq 0 ]; then echo giga; else echo koba; fi
koba
[c1000@s10 giga]$ a="1.2.3.4"; if [ "$a" -eq 0 ]; then echo giga; else echo koba; fi
-bash: [: 1.2.3.4: integer expression expected
koba
[c1000@s10 giga]$ a="1.2.3.4"; if [ "$a" -eq "0" ]; then echo giga; else echo koba; fi
-bash: [: 1.2.3.4: integer expression expected
koba
[c1000@s10 giga]$ a="1.2.3.4"; if [ "$a" == "0" ]; then echo giga; else echo koba; fi
koba
[c1000@s10 giga]$