前言
这是个小问题,本质原因是判断字符相等使用两个 ==
需要在 bash
环境下,而Ubuntu默认不是这个Shell环境,所以就会出现在 CentOS 上运行的好好的Shell,放到Ubuntu上就运行出错的问题,我遇到的问题本质也是这个原因,不过在复杂的状况下却不能一眼找到是哪里导致的。
现场还原
为了找出这个问题的原因,我把无关逻辑都去掉了,出现了下面a.sh
和 b.sh
两个脚本:
1 |
|
1 |
|
考虑到兼容问题,我还在开头写了 #!/bin/bash
,让它默认的用bash来执行,这样我无论在 Ununtu 还是其他的 Linux 版本都应该没问题了,可事实却不是这样,运行结果如下:
1 | root@demo:~# ./a.sh fly |
如果眼尖的话一眼就看出来了,问题出在 sh ./b.sh $VAL
这一句,导致 #!/bin/bash
没有起到作用,使用 sh
这个shell 来执行的 b.sh
脚本,所以用 ==
判断字符串相等会报错。
这个例子里很好发现,但是放在实际工作中的复杂脚本中就比较难发现了,再看报错 ./b.sh: 5
没有发现任何问题,因为查到可能是 Ubuntu 系统下的shell 语法导致的,我还尝试了多次改成单等号的写法,其他比较字符串的方式,依旧报错,但是当我发现问题的所在之后,无论单个等号还是两个等号我都能让他正确执行,这就是忙中出乱,静下来就好了
总结
- 使用
==
判断字符串相等是bash
中的语法 - Shell 脚本开头的
#!/bin/bash
表示执行脚本时若没有指定Shell类型,则用说明的这种Shell执行 - 遇到问题时需要静下心来慢慢解决,切忌忙中出乱
有的人活下来就已经花光了所有力气,还要靠什么去抗争命运~
2023-3-17 22:55:15