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

一、引言

最近在工作中开始尝试着使用 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:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章