Shell 踏坑之旅:if [ -n ] 意想不到的错误用法

混江龙づ霸主 提交于 2020-08-16 14:26:48

一、引言

最近在工作中开始尝试着使用 Shell 编写一些脚本来替代人力做一些繁琐而又简单的工作。

其中,我遇到这么一个问题,代码类似如下:

tmp_val=$(grep xxx tmp.txt)

if [ -n $tmp_val ] 
then echo yes
else echo no
fi

原意是想要从 tmp.txt 文件中查找 xxx 字符串,将 grep 的结果赋值给 tmp_val,如果存在的话,tmp_val 必然有值,就打印一个 yes,否则打印一个 no。

看似很简单的样子,但是当我执行上述代码后却发现,不管 tmp.txt 中到底有没有 xxx 字符串,最后都会打印出来一个 yes,这是为什么呢?

二、解决

经过我网上搜索相关资料发现:

当你 tmp_val 的值为空的时候,if [ -n $tmp_val ] 就相当于 if [ -n ],而 -n 在这里被识别为一个字符串,它不为空,必然判断永远都是真值

可见这确实是一个比较容易写错的地方,那么怎么修复这个问题呢?

tmp_val=$(grep xxx tmp.txt)

if [ -n "$tmp_val" ] 
then echo yes
else echo no
fi

我们只需要在 if [ -n ] 中的字符串变量外部增加一个双引号 "$tmp_val" 将变量括起来即可,这样即使变量为空,也不会出现 -n 判断的永远真值的问题了。

Shell 编程学习仍在路上,希望本篇博客能够给你带来一些帮助~~~

To be Stronger:)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!