bash - bash 'if' 测试失败,值大于 99(2 位)
问题描述
在我不理解的 bash shell 脚本中发现了一个奇怪的地方。在下面的代码序列中,定义了两个字符串;一个长度为 99 个字符,一个长度为 100 个字符。将每个字符串的长度与值 3 进行比较。如果使用“<”运算符,则如果第一个符号操作数的值大于 99(2 位),则测试失败。如果使用“-lt”运算符,则测试对于大于 99 的值可以正常工作。
我有两个问题:1)为什么?2)这是一个错误还是一个功能?
#/bin/bash
string99="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxy"
string100="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz"
lng99=`expr length $string99`
lng100=`expr length $string100`
echo
echo "-- 99 --------- if [[ \$lng < 3 ]] -----------------"
if [[ $lng99 < 3 ]]
then
echo "$string99 is $lng99 characters long."
else
echo "length of string is greater than 3"
fi
echo
echo "-- 99 -------- if [[ \$lng -lt 3 ]] ----------------"
if [[ $lng99 -lt 3 ]]
then
echo "$string99 is $lng99 characters long."
else
echo "length of string is greater than 3"
fi
echo
echo "-- 100 -------- if [[ \$lng < 3 ]] -----------------"
if [[ $lng100 < 3 ]]
then
echo "$string100 is $lng100 characters long."
else
echo "length of string is greater than 3"
fi
echo
echo "-- 100 ------- if [[ \$lng -lt 3 ]] ----------------"
if [[ $lng100 -lt 3 ]]
then
echo "$string100 is $lng100 characters long."
else
echo "length of string is greater than 3"
fi
这个测试序列的输出是:
-- 99 --------- if [[ $lng < 3 ]] -----------------
length of string is greater than 3
-- 99 -------- if [[ $lng -lt 3 ]] ----------------
length of string is greater than 3
-- 100 -------- if [[ $lng < 3 ]] -----------------
abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz is 100 characters long.
-- 100 ------- if [[ $lng -lt 3 ]] ----------------
length of string is greater than 3
解决方案
那是因为-lt
(还有-gt
, -ne
,-eg
等)用于数值比较。另一个按字典顺序比较字符串。
$ [[ "abc" < "bcd" ]] || echo "nope"
$ [[ "cbc" < "bcd" ]] || echo "nope"
nope
$ [[ "abc" -lt "bcd" ]] || echo "nope"
nope
$ [[ "cbc" -lt "bcd" ]] || echo "nope"
nope
我可以通过使用[
而不是显示它[[
:
$ [ "abc" -lt 0 ] || echo nope
bash: [: abc: integer expression expected
nope
推荐阅读
- javascript - 如何使用 html 按钮创建动态 socket.join(socket.room)
- c++ - 如何使用模板方法避免循环依赖
- distributed-system - PBFT:为什么副本在 2/3 准备好后不能执行请求?为什么我们需要提交阶段?
- javascript - Websocket 上的 ERR_NAME_NOT_RESOLVED
- android - 如何在 FragmentPagerAdapter (android.support.v4) 中使用 PreferenceFragment?
- sql - 定期向应用程序提供最新数据的最佳方式是什么?
- javascript - 如何在水平窗口调整大小时使网页的边距缩小?
- angular - 错误类型错误:Observable_1.Observable.combineLatest 不是函数
- windows - 有没有比使用 shell COM 组件更快的方法来获取文件元数据?
- webpack - 使用 babel-loader 和 jhipster webpack 配置