【Linux Shell】你知道bash shell和dash shell的区别吗?_架构师李肯的博客-程序员秘密_dash shell

技术标签: Linux  shell  脚本编程【Shell + Python + Bat】  嵌入式开发笔记  

最近在工作中遇到一个很奇葩的问题,就是一个嵌入式的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=1234

if [[ "$result" == "1234" ]]; then
        echo "yes"
else
        echo "no"
fi
if [ "$result" == "1234" ]; then
        echo "yes"
else
        echo "no"
fi
if [[ "$result" = "1234" ]]; then
        echo "yes"
else
        echo "no"
fi
if [ "$result" = "1234" ]; then
        echo "yes"
else
        echo "no"
fi

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

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

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

 为何???

原来,dash是很奇葩的:

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

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

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

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

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/szullc/article/details/118788780

智能推荐

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解_lijiang1025的博客-程序员秘密

代码改变世界Posts - 69, Articles - 0, Comments - 812 CnblogsDashboardLoginHomeContactGalleryRSSKenshin Cui's BlogCODING 完美世界... iOS开发系列--通讯录、蓝牙、内购、GameCenter、

Windows安装Redis及简单使用_查看电脑是否安装redis_酸菜鱼wj的博客-程序员秘密

安装 Redis访问https://github.com/MicrosoftArchive/redis/releases,选择需要的版本,展开 Assets 目录,可以选择 .msi 文件或 .zip 文件下载。如果下载 .msi 文件,可以直接执行安装(勾选对应的复选框),如果下载 .zip 文件,可以参考链接【Window配置Redis环境和简单使用】 https://www.cnblogs.com/wxjnew/p/9160855.html 来进行安装配置。检查 Windows 服务以 Wind

使用Postman进行数据提取并引用_postman提取身份证倒数第二位_后门别棍的博客-程序员秘密

如何使用Postman提取json格式数据并引用?可以使用postman内置函数进行提取找到”Tests“,在右边点击"Set an environment variable",会自动生成下面的代码pm.environment.set("variable_key", "variable_value");// variable_key:需要保存的变量名称// variable_value:需要保存的值示例:获取响应数据data下的”id“响应数据:{ "code": 200,

break与continue的区别_Particular12.的博客-程序员秘密

一、程序结构​ 程序结构:程序的执行顺序​ 顺序结构​ 选择(分支)结构​ if语句​ if…else​ if…else if…else​ switch​ 循环结构​ for​ while​ do…while​

zynq学习笔记四:编译linux内核_zynq内核编译_aostas的博客-程序员秘密

cd ~/buildgit clone https://github.com/Xilinx/linux-xlnx.git//获取源代码cd linux-xlnxgit checkout xilinx-v2015.2//改版本与网上大多数教程匹配make distcleanmake xilinx_zynq_defconfigmake menuconfig//编辑内核 还不会 直接退出m

【SDCC 2016现场】数据库/大数据技术实战专场实录(下)_孙_思的博客-程序员秘密

【SDCC现场报道】2016年4月22日-23日,由CSDN重磅打造的SDCC2016数据库&架构技术峰会在深圳隆重举行。这两场峰会大牛讲师来自百度、腾讯、阿里、京东、唯品会、滴滴出行、携程等知名互联网公司,共同探讨高可用/高并发/高稳定/高流量的系统架构设计、秒杀系统架构、搜索架构、中小企业架构之道、数据平台系统演进历程和技术剖析、传统数据库与分布式数据库选型/备份/恢复原理及优化实践、...

随便推点

电位器mcp4561调试记录---stm32,I2C通信_mcp4531 stm32_西皮南子的博客-程序员秘密

所用芯片是mcp4561-503,看数据手册知此型号是8位,对应257步默认值是80h对应电阻值是25k只有wiper0,没有wiper1.I2C地址:下图中mcp45x1的地址是0101 11+A0,从电路图上看A0引脚接地,所以地址是0101 110+R/W实际取到的读取数据波形:I2C.c文件/* Includes ---------...

Unity解耦合-事件的监听与广播系统_unit test 解耦合_FutureDr的博客-程序员秘密

Unity解耦合-事件的监听与广播系统目的解决方法测试目的解决代码之间耦合性问题解决方法利用委托封装事件方法,然后利用广播和监听事件来实现解耦委托脚本CallBack.cs//委托类,自己进行委托封装,可以添加多个参数public delegate void CallBack();public delegate void CallBack<T>(T arg);public delegate void CallBack<T, X>(T arg1, X arg2)

基于CNN卷积神经网络的KNN算法实现_cnn knn_抹茶2077的博客-程序员秘密

基于CNN卷积神经网络的KNN算法实现前言一、KNN是什么?二、原理介绍1.对数据预处理1. 计算测试样本点2. 读入数据三、完整代码实现1. KNN方法优缺点2. 代码实现总结前言暑假自学深度学习的时候曾经写过的几个卷积神经网络的基础算法,因为自己也是新手,所以自认为注释写的相当友好hhh。一、KNN是什么? KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常

在Unity中为即时战略游戏实现战争迷雾(上)_unity实现地图迷雾_ivanmrt的博客-程序员秘密

  本文将由游戏开发工程师Ariel Coppes分享在Unity中为即时战略游戏实现战争迷雾效果。  过去三年中,我一直在Ironhide Game Studio开发移动即时战略游戏《钢铁战队》。在开发过程中,我实现了适合这款游戏的战争迷雾效果,但该实现方法缺乏即时战略游戏中的一些常见功能,我希望有一天能够找到改进它的方法。  最近,我在拳头游戏开发博客阅读到了一篇关于《英雄联盟》中战争...

QT序列式容器_mmmcu2004的博客-程序员秘密

序列式容器QVector是一个类数组(array-like)的数据结构,它将它的条目存储在内存中相邻的位置上。 向量区别于普通的C++数组的是向量知道自己的大小并能够调整自己的大小。 在向量的尾部追加数据是非常高效的,而从向量的头部或中间插入数据的代价是很昂贵的。图 11.1. 一个double类型向量如果我们事先知道要用到的条目数,我们可以在定义向量的时候给它一个初始大小并使

1.1 Go语言介绍_1+1语言_搬砖的乔布梭的博客-程序员秘密

历史掌故 开源的编程语言 简单、可靠、高效 作者 Rob Pike 曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。 Robert Griesemer 曾协助制作Java的H...

推荐文章

热门文章

相关标签