我正在尝试在systemd单元文件中执行以下操作。我在这里面临2个问题
-
publicIPAddress可能是空字符串,因此我认为ipLength应该为零,这不应该导致[::整数表达式预期错误,但我收到错误。
-
ipLength似乎每次都是空的,即使对于公共IP地址的有效值也是如此。我错过了什么吗?
/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
所以事实证明,这里的问题是这个脚本被嵌入在一个systemd单元文件中。
似乎systemd本身理解${var}
扩展,并且在脚本看到它之前就${#publicIPAddress}
扩展了。
用另一个$
逃离$
将保护它免受systemd这样做的影响。
所以使用
ipLength=$${#publicIPAddress};
而不是
ipLength=${#publicIPAddress};
在脚本中。
删除 if 语句中 ipLength 变量周围的 "(双引号)。
然后它会工作 --OR 如果你想使用引号,那么使用 == "0" 而不是使用 -eq。
我还建议使用 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]$