shell 字符串比较与脚本 too many arguments 报错
一、问题
最近在写 shell 脚本的时候,遇到了一些小问题,就是我在判断一个字符串是否为空的时候经常报下面的错,程序是正常执行了,但是有这个提示很蛋疼,下面就是看看是什么问题导致的?
[: too many arguments
二、问题解析
原始脚本
我的脚本是这样写的
#!/bin/bash
list='1 2 4 ad'
if [ $list -eq '' ]
then
echo "empty"
else
echo "not empty"
fi
运行后
[root@wi-mi-2034 scripts]# bash test.sh
test.sh: line 3: [: too many arguments
not empty
第一个问题: -eq 是用于比较两个数字的,比较字符串要使用 ==。
更改版本一 使用 "==" 进行比较
使用 "==" 进行比较,替换 -eq.
#!/bin/bash
list='1 2 4 ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
运行之后
[root@wi-mi-2034 scripts]# bash test.sh
test.sh: line 3: [: too many arguments
not empty
还是有这个报错,但是经过我的测试发现,如果我们将 list 值设置为 没有空格的话,是不会出现这个问题。
更改版本二 使用 "==" 进行比较,更改变量的值
list 原来的值为:1 2 4 ad 更改为 ad
#!/bin/bash
list='ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
运行之后
[root@wi-mi-2034 scripts]# bash test.sh
not empty
运行正常。
问题原因
问题是有空格导致的。但是经过我们的测试,发现,形如 ad和 ad 和 ad ,这种单单前后有空格的,是不会报错的,但是像 ad ad,这种两个字符直接有空格的话,是会进行报错的。
三、问题解决
字符串判断
使用 == 进行判断字符串是否相等, 判断字符串是否为空的话用 -z或者 -n
== :判断字符串是否相等
-z :判断 string 是否是空串
-n :判断 string 是否是非空串
在进行字符串判断的时候使用 ""或者 ''.
- '' :单引号不适合在引用变量做比较的时候使用。因为它会让变量拿不到值。
- "" :适合在任何时候引用,引用变量以及不引用变量都可以使用。
示例:当我们的字符串必须包含空格的时候
#!/bin/bash
list='1 2 4 ad'
if [ $list == '' ]
then
echo "empty"
else
echo "not empty"
fi
我们可以在使用变量做比较的时候,在变量外使用双引号。
#!/bin/bash
list='1 2 4 ad'
if [ "$list" == '' ]
then
echo "empty"
else
echo "not empty"
fi
shell 字符串比较与脚本 too many arguments 报错的更多相关文章
- shell脚本if判断语句报错[: too many arguments的两种原因
shell脚本,if判断语句报错[: too many arguments 我遇到过两种情况: 1.第一中情况就是网上大家说的,字符串变量中可能存在空格,shell解析时将其认为是多个参数,再进行判断 ...
- Jenkins在shell脚本运行docker权限报错解决
报错环境 系统信息 Distributor ID: Ubuntu Description: Ubuntu 16.04.1 LTS Release: 16.04 Codename: xenial doc ...
- LoadRunner录制回放脚本RecContentType=application/json报错
今天做一个新项目,项目系统的框架是用SSH,特意查看了一下项目源码,用的ajax提交比较多,主要的问题是该系统对IE(8~10)浏览器都不兼容,无法进行录制. 是问题,总有解决的办法! 我本机为Loa ...
- loadrunner脚本因为没有token报错
目录 场景 解决过程 解决方案 总结 场景 用loadrunner11录制脚本,处理后回放,加上检查点,报错找不到检查点对应的内容,去掉检查点,没有报错,但是打开页面没有该操作的痕迹.手动在页面上操作 ...
- MySQL执行外部sql脚本文件命令是报错:unknown command
使用source导入外部sql文件: mysql> source F:\php\bookorama.sql; -------------- source F: -------------- ER ...
- zabbix官方源替换为阿里云的zabbix源,一键脚本。(安装zabbix报错curl#18 - "transfer closed with 2988713 bytes remaining to read":15 ETA Trying other mirro)
最近突然安装zabbix总是报错,比如 (24/27): t1lib-5.1.2-14.el7.x86_64.rpm | 166 kB 00:00:00 zabbix-web-4.4.6-1.el7. ...
- Django 执行单独脚本及SyntaxError缩进报错解决
有时候会碰到这样的场景,对于一些业务升级,我需要把数据库数据做些处理,同时又想以 Django 项目的环境变量执行脚本,这个时候使用 python 脚本是再适合不过的手段了. 注意:在pycharm里 ...
- PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)
php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as arra ...
- win处navicat直接导出的sql脚本导入Linux mysql报错问题
最近几天在把win上的项目的数据库转移到Ubuntu,于是第一件事就是从win处的navicat直接导出sql脚本,然后进入Ubuntu导入的时候会报错误,跳过错误继续执行导致数据库表的缺失. 跨平台 ...
随机推荐
- Mongoose: aggregate聚合 $group使用说明
aggregate聚合是通过管道操作实现的.聚合管道里的每一步输出,都会作为下一步的输入,每一步在输入文档执行完操作后生成输出文档. 聚合管道: $project 修改输入文档的结构.可以用来重命名 ...
- Rust到底值不值得学--Rust对比、特色和理念
前言 其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了. 当然这只是一个玩笑,可别把这个问题当真. 然而对于IT从业者来说,这可不是一个玩笑.几乎每一次的技术发 ...
- node.js操作数据库之MongoDB+mongoose篇
前言 node.js的出现,使得用前端语法(javascript)开发后台服务成为可能,越来越多的前端因此因此接触后端,甚至转向全栈发展.后端开发少不了数据库的操作.MongoDB是一个基于分布式文件 ...
- 设计模式----创建型型模式之单件模式(Singleton pattern)
单件模式,又称单例模式,确保一个类只有一个实例,并提供全局访问点. 单件模式是比较简单且容易理解的一种设计模式.只有一个实例,通常的做法...TODO 类图比较简单,如下所示: 示例代码: 懒汉模式( ...
- CSS实现带箭头的提示框
我们在很多UI框架中看到带箭头的提示框,感觉挺漂亮,但是之前一直不知道其原理,今天网上找了些资料算是弄清楚原理了: 先上效果图: 原理分析: 上面的箭头有没有觉得很像一个三角形,是的,它就是三角形:只 ...
- ElasticSearch Cardinality Aggregation聚合计算的误差
使用ES不久,今天发现生产环境数据异常,其使用的ES版本是2.1.2,其它版本也类似.通过使用ES的HTTP API进行查询,发现得到的数据跟javaClient API 查询得到的数据不一致,于是对 ...
- 网络驱动之net_device结构体
在Linux系统中,网络设备都被抽象为struct net_device结构体.它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.3 ...
- Faker——生成测试数据的PHP类库
工作上用的是TP框架,每次测试功能的时候都要手动添加测试数据,词穷起名总是起一些test1.test2这种low到爆炸的用户名,这让我很难受.稍微翻阅了一些资料,发现laravel有一个生成测试数据的 ...
- iOS RGBA转YV12
引言 因为项目中要做画面共享,所以需要学一点图像相关的知识,首当其冲就是RGB转YUV了,因为图像处理压缩这一块是由专业对口的同事做的,所以呢,我这就是写一下自己的理解,如有不对的地方,还望指正,谢谢 ...
- lua行为树设计与实现
项目需要,之前行为树用的是behaviorDesigner,要改成纯lua的 我先做了一版用递归实现,代码可读性高但是中断机制实现起来比较复杂,而且创建自定义action重写方法时需要调用父类的方法, ...