最近都在写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 脚本的坑的更多相关文章

  1. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  2. 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  3. shell脚本排坑

    jenkins用来输出日志: tail -f  /tmp/i.log   & { sleep 15; eval 'kill -9 $!' &> /dev/null; } 去时间秒 ...

  4. 那些天,shell脚本中曾经踩过的坑

    前些天,需要实现一个需求,用脚本轮流kill服务器上的进程,观察内存变化情况,并写日志.脚本逻辑不难,但shell脚本好久不用,看过书里的语法都忘得差不多了,中间踩了不少的坑,特此记录一下,留作后续参 ...

  5. linux shell脚本中使用expect(脚本打开新终端自动远程连接顺便输一点指令)(巨坑)

    放弃吧 我找了六个小时都没找到可以用的方案(指标题括号里的内容) 给个曲线救国的方法: 现把expect脚本写成一个文件 在另一个shell脚本中调用

  6. linux下shell脚本执行jar文件

    最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...

  7. shell脚本监控MySQL服务是否正常

    监控MySQL服务是否正常,通常的思路为:检查3306端口是否启动,ps查看mysqld进程是否启动,命令行登录mysql执行语句返回结果,php或jsp程序检测(需要开发人员开发程序)等等: 方法1 ...

  8. 如何进行shell脚本正确性测试

    在实际工作中,需要对shell脚本进行正确性测试. 如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严 ...

  9. 写hive sql和shell脚本时遇到几个蛋疼的问题!

    错误一: Hive的where后不能用字段的别名, 错误二: hive的groupby中不能用自己定义函数,否则报错(用嵌套select取代) 错误三: 运行:$ ./hive_game_operat ...

随机推荐

  1. Windows 10 四月更新,文件夹名称也能区分大小写?

    Windows 向来是不区分文件和文件夹大小写的,但是从 NTFS 开始却又支持区分文件夹大小写.而 Linux/Mac OS 一向都是区分文件和文件夹大小写的. 本文将推荐 Windows 10 四 ...

  2. 前端(六):JavaScript面向对象之宿主对象

    宿主对象即浏览器提供的对象,主要包括DOM对象和BOM对象. 一.DOM源起 1.SGML.XML和XHTML SGML(标准通用标记语言)是定义使用标签来表示数据的标记语言的语法. - 标签由一个小 ...

  3. windows中查看端口被什么应用程序占用并删除

    windows中查看端口的命令是netstat,具体用法如下: 查看端口信息时可以使用如下命令: netstat -ano 运行结果如下: 当前我的本地13067端口被占用,使用命令如下: c:\&g ...

  4. CentOS 7.0 yum安装Apache、PHP和MySQL

    centos7默认将mariadb视作mysql. p.s.因为mysql被oracle收购后,原作者担心mysql闭源,所以又写了一个mariadb,这个数据库可以理解为mysql的分支. 卸载ma ...

  5. C#封装的一个JSON操作类

    using System; using System.Collections.Generic; using System.Collections; using System.Text; using S ...

  6. BZOJ4547 Hdu5171 小奇的集合

    题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...

  7. java创建多线程&创建进程

    概述 并发和并行是即相似又有区别: 并行:指两个或多个事件在同一时刻发生: 并发:指两个或多个事件在同一时间段内发生. 进程是指一个内存中运行中的应用程序.每个进程都有自己独立的一块内存空间,一个应用 ...

  8. Linux环境下安装Nexus

    JDK的安装本文不在说了. 直接进入正题. 1. wget http://www.sonatype.org/downloads/nexus-2.13.0-01-bundle.tar.gz 获取nexu ...

  9. 什么是Spark(四)集群

    Driver,主要的职责是生成DAG以及生成物理执行计划(Physical Execution Plan):Application,Job以及Stage都是在这个组建中生成的: ClusterMast ...

  10. m'ybatis 一对一 一对多 配置详解

    javabean: package com.me.model; import java.io.Serializable; import java.util.Date; import java.util ...