shell 脚本的坑
最近都在写shell脚本,免不了遇到每个新手都要填的坑,在这里简单记录一下。
test语句的坑
test语句在shell脚本里用的非常多,像if语句后面的其实都是test语句,也是新手最容易遇到坑的地方之一
(1)[: =: unary operator expected
if [ $var = "hello" ]; then
echo "world"
fi
如果var的值为空,执行上面这段脚本的时候会出现这样的错误./test.sh: line 12: [: =: unary operator expected
运行脚本之前加上-x参数,在每条命令执行前打印出命,就可以发现问题了,这个时候 [ 跟 "hello"做比较,可以test语句少了个"[",因此解析时会出现语法错误。
修正为 if [ "$var" = "hello" ] 问题就解决了,有了双引号之后,就可以将空字符与"hello"作比较,这样就不会出错了,当然这个错误只有在var为空值的时候才会发生。
(2)[: too many arguments
如果var是包含空格的字符串那么在if语句中没有给$var加上双引号时,会出现上面的错误,原因是在解析test语句时,没有引号就不能将=号左边的变量完整的解析成一个字符串,使得其无法跟右边的字符串比较,解决的方法也是给$var加上引号。
ls语句的坑
file_list=$(ls test/*)
for file in $file_list; do
echo $file
done
这样一段代码,看上去是没问题的,不过当test目录下的文件有文件名包含空格的话,文件名就会被拆开,这样输出的文件就不是目录下原有的文件了,
解决的方法是直接把for语句写成 for file in test/* 注意不要写成“test/*”否则所有的文件都会在同一行列出,这样就不能一个个文件地进行操作。
暂时就这么多坑,后续有的继续加上
shell 脚本的坑的更多相关文章
- 向大家分享一个shell脚本的坑
打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...
- 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致
打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...
- shell脚本排坑
jenkins用来输出日志: tail -f /tmp/i.log & { sleep 15; eval 'kill -9 $!' &> /dev/null; } 去时间秒 ...
- 那些天,shell脚本中曾经踩过的坑
前些天,需要实现一个需求,用脚本轮流kill服务器上的进程,观察内存变化情况,并写日志.脚本逻辑不难,但shell脚本好久不用,看过书里的语法都忘得差不多了,中间踩了不少的坑,特此记录一下,留作后续参 ...
- linux shell脚本中使用expect(脚本打开新终端自动远程连接顺便输一点指令)(巨坑)
放弃吧 我找了六个小时都没找到可以用的方案(指标题括号里的内容) 给个曲线救国的方法: 现把expect脚本写成一个文件 在另一个shell脚本中调用
- linux下shell脚本执行jar文件
最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...
- shell脚本监控MySQL服务是否正常
监控MySQL服务是否正常,通常的思路为:检查3306端口是否启动,ps查看mysqld进程是否启动,命令行登录mysql执行语句返回结果,php或jsp程序检测(需要开发人员开发程序)等等: 方法1 ...
- 如何进行shell脚本正确性测试
在实际工作中,需要对shell脚本进行正确性测试. 如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严 ...
- 写hive sql和shell脚本时遇到几个蛋疼的问题!
错误一: Hive的where后不能用字段的别名, 错误二: hive的groupby中不能用自己定义函数,否则报错(用嵌套select取代) 错误三: 运行:$ ./hive_game_operat ...
随机推荐
- 20179223《Linux内核原理与分析》第三周学习笔记
测试3的实验: 1. 用gcc -g编译vi输入的代码 2. 在main函数中设置一个行断点 3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点 4. 提交调 ...
- consul dns 转发配置
测试使用dnsmasq. 优势:可以方便的进行应该编码,进行动态域名解析,容错处理. 因为consul 默认的dns 为127.0.0.1 8600 所以配置如下: 文件目录: /etc/d ...
- 在Eclipse中配置Tomcat7.0
为了在Eclipse中进行struts2的测试,才发现自己机器上的Eclipse没有集成Tomcat,在网上找了半天,不是这个插件没有下载地址,就是那个有好多注意事项或者版本问题.结果,自己到tomc ...
- CAS原理分析
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...
- ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...
- Virsh中创建虚拟机两种方式define和create的区别
本质上两者一样的,都是从xml配置文件创建虚拟机 define 丛xml配置文件创建主机但是不启动 create 同样是丛xml配置文件创建主机,但是可以指定很多选项,比如是否启动,是否连接控制台 ...
- Python笔试面试题_牛客(待完善)
中文,免费,零起点,完整示例,基于最新的Python 3版本.https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42 ...
- 老齐python-基础4(元祖、字典、集合)
1.元祖 元祖的特性结合了字符串和列表 元祖是用圆括号括起来的,其中的元素之间用逗号(英文半角)隔开.元祖中的元素是任意类型的python对象(包括以后自定义的对象) 元祖中的元素不可更改,所以修改列 ...
- JSch基本使用
JSch基本使用 JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2 ...
- 使用wifi网卡笔记2----概念及工具iw(STA模式)
1.认证和加密的概念 (1)概念 (2)阶段划分 初级版本:认证不需要密码, 传输不需要加密 认证不需要密码, 传输需要加密(用WEP算法) 认证需要密码(用WEP算法), 传输需要加密(用WEP算法 ...