最近在工作中遇到一个很奇葩的问题,就是一个嵌入式的SDK编译,它里面执行shell命令的时候,使用的dash shell来解析,而通常我们默认用的是bash shell来解析;我按照bash shell那样照常编写脚本,大部分的脚本是没有问题的,但是偏偏就被我遇到了不一样的地方,以此文记录下。

先说下bash shell与bash shell的关系。

什么是bash ?

Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。

GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。

Debian和Ubuntu中,/bin/sh默认已经指向dash,这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准。

简单来说,就是dash是bash的简化版本,没有支持那么复杂的东西。

再看下我遇到的问题,为了好做对比,我分别写了1个脚本,分别用bash和dash去解析运行,得出不同的答案。

脚本内容如下:


result=1234if [[ "$result" == "1234" ]]; thenecho "yes"
elseecho "no"
fi
if [ "$result" == "1234" ]; thenecho "yes"
elseecho "no"
fi
if [[ "$result" = "1234" ]]; thenecho "yes"
elseecho "no"
fi
if [ "$result" = "1234" ]; thenecho "yes"
elseecho "no"
fi

OK,脚本对应的行号如下所示:

使用/bin/bash运行,一切正常,输出4个yes

使用/bin/dash运行,只有一个输出正常,3处报错!!!

为何???

原来,dash是很奇葩的:

  • if 里面的条件语句只能使用 [ ] 不能使用 [[ ]];
  • 字符串判断,只能使用 = 不能使用 ==;

word天呐!!就是这么回事。

我们还可以使用 ls -al /bin/sh查看下系统默认的shell解析器是什么,如下:

至于 [ ] 与 [[ ]] 的区别,可以参考这篇文章:Linux Shell 中的 ()、(())、[]、[[]]、{} 怎么用是不是还傻傻分不清?

== 可用于判断变量是否相等,= 除了可用于判断变量是否相等外,还可以表示赋值。

= 与 == 在 [ ] 中表示判断(字符串比较)时是等价的。

今天的总结就介绍到这,有什么问题,欢迎你在评论区告诉我。

【Linux Shell】你知道bash shell和dash shell的区别吗?相关推荐

  1. linux下的各种shell介绍(bash和dash转换)

    在linux下编写shell脚本文件时,经常会看到很多人在文件的第一行中标注"#!/bin/bash".这句话的意思是告诉系统强制用bash,避免出现一些不兼容的问题. 那么,在l ...

  2. shell for循环命令行_24 道 shell 脚本面试题

    想要成为中高级phper, shell 脚本是需要掌握的,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么. ...

  3. Linux编程 3 (初识bash shell与man查看手册)

    一.初识bash shell 1.1 启动 shell   GNU bash shell 能提供对Linux系统的交互式访问.通常是在用户登录终端时启动,登录时系统启动shell依赖于用户账户的配置. ...

  4. [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://ww ...

  5. Linux 学习记录 四(Bash 和 Shell scirpt).

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

  6. linux shell脚本 wget,bash – 在shell脚本中运行wget和其他命令

    以下是编写shell脚本时要使用的一些准则. >使用它们时始终引用变量.这有助于避免误解的可能性. (如果文件名包含空格怎么办?) >不要相信像rm这样的命令上的文件加载.请改用循环. ( ...

  7. 如何在 Linux 中创建并运行 Shell 脚本(Bash 初学者教程)

    文章目录 1.创建并运行第一个 shell 脚本 2.将 shell 脚本转换为 bash 脚本 3.为什么大多数 shell 脚本都包含 #! /bin/bash 在 shell 脚本的开头? 4. ...

  8. bash shell sleep_如何使用Linux Sleep命令暂停Bash脚本

    原标题:如何使用Linux Sleep命令暂停Bash脚本 Sleep是一个命令行实用程序,允许您将调用进程挂起一段指定的时间.也就是说,sleep命令在给定的时间内暂停下一个命令的执行. 当在bas ...

  9. linux shell 鼠标事件,Bash Shellshock事件:CVE-2014-6271资料汇总

    法国GNU/Linux爱好者Stéphane Chazelas于2014年9月中旬发现了著名SHELL实现BASH的一个漏洞,你可以通过构造环境变量的值来执行你想要执行的脚本代码,据报道称,这个漏洞能 ...

最新文章

  1. 深度理解do{} while(0)语句的作用
  2. JUnit中@Test的运行顺序
  3. meta viewport相关
  4. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  5. linux 查看磁盘空间大小命令
  6. python—datatable加载数据
  7. firefox浏览器和IE
  8. Android studio : 模拟器 真机 运行失败(mac电脑)
  9. Java集合干货——HashMap源码分析
  10. java 使用qq邮箱发送邮件报错 port: 465, response: 550 错误
  11. 深入浅出WPF笔记——Binding
  12. 折扇同构图形_独具一格!同构图形设计技法
  13. 二分类图片标签从0-1改为0-255——将图片位深度从1改为8
  14. 《生活中的魔法数学》读后感
  15. Java中创建Excel文档,POI使用详解
  16. iPhone 15 高端版本万元起步;华为授权 OPPO 使用其 5G 技术;DeepMind 推出 AI 编剧|极客头条
  17. matlab如何就导数,Matlab微分和导数
  18. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?
  19. Aruba7010 默认密码_工信部提醒:手机要及时设置SIM卡密码!很多人都不知道!...
  20. xgboost的使用简析

热门文章

  1. loj 2495. 「AHOI / HNOI2018」转盘
  2. 有效控制物流运输过程成本10项措施
  3. Tomcat目录结构
  4. Git使用及安装教程
  5. Python数据分析师训练营全套课程
  6. 【DL】基于pytorch搭建BP神经网络/人工神经网络/多层感知机/全连接神经网络的鸢尾花分类
  7. android mediaplayer 错误码,MediaPlayer 错误码
  8. 谷歌人工智能检索开普勒望远镜数据后,找到了“迷你太阳系”
  9. 剩余运算符--...
  10. k8s部署jenkins和Pod始终为pending状态“persistentvolume-controller no persistent volumes available.....”解决办法