0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RT-Thread学习笔记】bash和dash-shell

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-07-30 13:49 次阅读

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

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

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

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

为何???

原来,dash是很奇葩的:

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

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

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

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

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

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

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304816
  • Shell
    +关注

    关注

    1

    文章

    365

    浏览量

    23357
  • Bash
    +关注

    关注

    0

    文章

    57

    浏览量

    10179
  • RT-Thread
    +关注

    关注

    31

    文章

    1285

    浏览量

    40085
收藏 人收藏

    评论

    相关推荐

    RT-Thread学习笔记】使用scons命令生成静态库

    RT-Thread学习笔记】如何使用scons 命令中buildlib的生成静态库?
    的头像 发表于 07-27 09:13 5961次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】使用scons命令生成静态库

    RT-Thread学习笔记bash shell -e参数

    bash shell -e参数的含义与用途,你了解吗?
    的头像 发表于 07-28 05:20 1833次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】<b class='flag-5'>bash</b> <b class='flag-5'>shell</b> -e参数

    RT-Thread学习笔记和finsh shell配置方法

    配置。图解详细步骤:RT-Thread学习笔记--finsh shell配置方法 RT-Thread学习
    发表于 02-12 00:01

    RT-Thread Nano入门学习笔记

    RT-Thread Nano入门学习笔记
    发表于 11-26 12:36 20次下载
    <b class='flag-5'>RT-Thread</b> Nano入门<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    RT-Thread 应用笔记 - RTC Alarm 组件的使用

    RT-Thread 应用笔记 - 不正确使用LOG也会引发hard faultRT-Thread 应用笔记 - RTC Alarm 组件的使用RT-
    发表于 01-25 18:18 10次下载
    <b class='flag-5'>RT-Thread</b> 应用<b class='flag-5'>笔记</b> - RTC Alarm 组件的使用

    RT-Thread 内核学习笔记 - 理解defunct僵尸线程

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:19 8次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 理解defunct僵尸线程

    RT-Thread 内核学习笔记 - 设备模型rt_device的理解

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:19 8次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 设备模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 内核学习笔记 - 内核对象链表结构深入理解

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:23 6次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象链表结构深入理解

    RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:24 3次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象初始化链表组织方式

    RT-Thread 内核学习笔记 - 内核对象操作API

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:26 7次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象操作API

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 4546次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b> <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread学习笔记】Makefile的FORCE

    RT-Thread学习笔记】十分钟学会Makefile的FORCE
    的头像 发表于 07-30 13:55 2547次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】Makefile的FORCE

    RT-Thread学习笔记】如何抓取终端的网络报文

    RT-Thread学习笔记】如何抓取终端的网络报文?
    的头像 发表于 07-30 13:57 2810次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】如何抓取终端的网络报文

    RT-Thread学习笔记】用memwatch排除内存泄露

    RT-Thread学习笔记】使用memwatch排除内存泄露
    的头像 发表于 07-30 14:01 2326次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】用memwatch排除内存泄露

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 3932次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>学习</b>