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 ...
随机推荐
- 51nod 1600 Simple KMP【后缀自动机+LCT】【思维好题】*
Description 对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x<i) 显然对于一个字符串,如果我们将每个0<=i&l ...
- BZOJ3730 震波 【动态点分治】*
BZOJ3730 震波 Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土 ...
- 20179223《Linux内核原理与分析》第八周学习笔记
视频学习 可执行文件是怎么得来的? .c汇编成汇编代码.asm,然后再汇编成目标码.o.然后在连接成可执行文件,然后加载到内存可执行了. 对hello.c文件预处理(cpp),预处理负责把includ ...
- 你真的了解分层架构吗?——写给被PetShop"毒害"的朋友们
一叶障目 .NET平台上的分层架构(很多朋友称其为“三层架构”),似乎是一个长盛不衰的话题.经常看到许多朋友对其进行分析.探讨.辩论甚至是抨击.笔者在仔细阅读了大量这方面文章后,认为许多朋友在分层架构 ...
- SmartFoxServer资料
http://blog.sina.com.cn/s/blog_6bc2090c0100pgkx.html http://www.cnblogs.com/winson-w/p/3555106.html ...
- 运维命令:tcpdump
tcpdump命令 tcpdump 命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用 -w 选项将数据包保存到文件中,方便以后分析. 常用参数: -a:尝试将网络 ...
- Request.UrlReferrer详解
使用前需要进行判断: if (Request != null && Request.UrlReferrer != null && Request.UrlReferrer ...
- 快速创建yii2 RESTful api的小记
1.复制backend的应用到同级目录,改名叫api 2.然后就是配置项修改,common和api目录下的 common下: bootstrap.php最后添加一行配置 api/config/main ...
- EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)
原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...
- HTML第一讲
HTML标记区分 HTML即超文本标记语言(HtyperText Markup Language),其作用就是将编辑的内容在屏幕上显示.文件的后缀为.HTML. 在HTML中成对出现的叫做双标记(譬如 ...