当前位置: 首页 > news >正文

bash和dash的区别(及示例)

什么是bash、dash

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标准。

要知道自己自己的/bin/sh指向那个解析器,可使用 ls -al /bin/sh 查看

netsky@netsky:~$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 Mar 23  2022 /bin/sh -> dash

bash和dash语法区别

bash和dash语法上的主要区别有:

1. 定义函数

dash中没有function关键字,而bash可以有也可以没有function关键字

# dash这里没有function关键字,使用function,将在"("附近报语法错误
function func1(){echo "print func1"
}# 该写法bash和dash均支持
func2(){echo "print func2"
}func1
func2

结论:定义函数时不使用function关键字达到通用的目的。

2. select var in list; do command; done

dash不支持该写法,需要改成while read case 来实现

# dash不支持select选择语句
select animal in lion tiger panda flower; doif [ "$animal" = "flower" ]; thenecho "Flower is not animal."breakelseecho "Choose animal is: $animal"fi
done# bash和dash均支持while read case 写法
while true
docat << EOF1) lion2) tiger3) panda4) flower
EOFread -p "input :" animalcase "$animal" in1) echo "lion";;2) echo "tiger";;3) echo "panda";;*) echo "not animal"break;;esac
done

结论:使用while read case写法达到通用的目的。

3. {0…10}

dash不支持{m…n}展开,识别为单个整体

# dash不支持{m..n}展开
for i in {0..10}
doecho $i
done# bash和dash均支持
for i in $(seq 11)
doecho $i
done

结论:使用seq或者其它loop写法,为了灵活使用的话,可使用bash,并使用bash 脚本名称 的方式运行脚本。

4. here strings

dash不支持here string,改成here document

# dash不支持here strings
cat <<< "here strings"# bash和dash均支持here document
cat << EOF
here document
EOF

结论:使用here document 达到通用的目的。

5. >&word重定向标准输出和标准错误

当word为非数字时,bash中>&word变成重定向标准错误和标准输出到word中
而dash中>&word,word不支持非数字,替代方法是: >word 2>&1

# bash支持的写法  
echo "1234" >&err1.log# bash和dash均支持的写法
echo "5678" >err2.log 2>&1

结论:使用通用的重定向标准输入和标准错误写法。

6. 数组

bash支持数组,而dash不支持,需要替代

# bash支持的写法
array=(test001 test002 test003)
echo ${array[2]}# bash和dash均支持的写法,需注意会替换掉传参,需及时赋值 
var="test001 test002 test003"
set -- $var
echo ${3}       # 超过10个,需注意${10}写法

结论:bash很灵活,如果需要通用,需要使用替代写法。

7. 子字符串扩展

bash支持${parameter:offset:length}等写法
而dash不支持这类扩展,替代方法是使用其它外部命令

str="Abcdefgh"# bash和dash均支持的写法,cut从第N位开始
echo $str | cut -b 4-5# bash支持的写法,跳过(offset)M位,从M+1位开始
echo ${str:3:2}

结论:bash很灵活,如果需要通用,需要使用替代写法。

8. 大小写转换

bash支持 p a r a m e t e r p a t t e r n , {parameter^pattern}, parameterpattern,{parameter^^pattern}大小写替换写法
而dash不支持这类扩展,替换方法是使用使用其它外部命令(如tr/sed/awk)

str1="abcdefgh"
str2="ABCDEFGH"# bash和dash均支持
echo ${str1} | sed 's/^\b[a-z]/\U&/'
echo ${str2} | sed 's/^\b[A-Z]/\L&/'echo ${str1} | tr [:lower:] [:upper:]
echo ${str2} | tr [:upper:] [:lower:]# bash支持 ^(大写), ,(小写), ~(反转)
echo ${str1^}
echo ${str1^^}echo ${str2,}
echo ${str2,,}

结论:bash很灵活,如果需要通用,需要使用替代写法。

9. 进程替换<(command), >(command)

bash支持进程替换
dash不支持,替代方法是使用临时文件转换

# bash和dash均支持临时文件的写法,这里只是示例
echo "test001" > 10.tmp
while read user
doecho $user
done < 10.tmp# bash支持进程替换,注意 <() 是个整体
read user < <(echo "test002")
echo $user

结论:bash很灵活,如果需要通用,需要使用替代写法。

10. [ str1 = str2 ]和[ str1 == str2 ]

bash两种方法均支持
dash仅支持=写法

str="A"# bash和dash均支持
[ $str = "A" ] && echo 1 || echo 2# bash支持
[ $str == "A" ] && echo 11 || echo 12

结论:使用=写法达到通用的目的。

11. [[]] 加强版test

bash支持[[]] 写法,可实现正则匹配等强大功能
dash不支持该语法,需要使用替代写法。

tel=23800138000# bash和dash均支持,使用外部命令方式
echo "$tel" | sed 's/2[0-9]\{10\}/1/'# bash支持
[[ $tel =~ 1[0-9]{10} ]] && echo 1 || echo 2

结论:bash很灵活,如果需要通用,需要使用替代写法。

12. for ((expr1; expr2; expr 3)); do list; done

bash支持C语言格式的for循环
dash不支该语法,需要使用替代写法(如:while $((expr)))。

# bash和dash均支持
i=0
while [ $i -lt 10 ]
doecho $ii=$((i+=1))
done# bash支持
for ((i=0;i<10;i++))
doecho $i
done

结论:bash很灵活,如果需要通用,需要使用替代写法。

13. let命令和((expression))

bash支持let,也支持((expression))
dash不支持,替代方法是采用$(())或者使用其它外部命令做计算

a=10# bash和dash均支持下面两种写法  
a=$((a+=1))
echo $aa=$(expr $a + 1)
echo $a# bash支持let和((expression))写法 
let a++
echo $a((a++))
echo $a

结论:bash很灵活,如果需要通用,需要使用替代写法。

14. $((expression))

bash支持i++,++i,i–这样的表达式
dash不支持++,–,替代方法是i+=1,i=i+1

a=10# bash和dash均支持
echo $((a=a+1))# bash支持++
echo $((a++))

结论:bash很灵活,如果需要通用,需要使用替代写法。

总结

bash相对于dash来说很灵活,有更多的语法支持。
需要通用的情况下,需要注意差异,使用符合POSIX标准的写法;如果确定能使用bash的情况下,将能更灵活使用。
需要特别注意的是:

  • 如果shell脚本是使用bash编写,但当前的/bin/sh链接到的是dash,那么"sh 脚本" 将会使用dash来执行,而忽视头部shell指示!
  • 如果shell脚本是使用bash编写,请使用"bash 脚本" 或者 “./脚本” 的方式执行脚本。

相关文章:

bash和dash的区别(及示例)

什么是bash、dash Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell&#xff0c;事实上&#xff0c;还有许多传统UNIX上用的Shell&#xff0c;像tcsh、csh、ash、bsh、ksh等等。 GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接&#xff0…...

Java基础入门day65

day65 web项目 页面设计 仿照小米官网&#xff0c;将首页保存到本地为一个html页面&#xff0c;再将html页面保存为jsp页面&#xff0c;在项目中的web.xml文件中配置了欢迎页 <welcome-file-list><welcome-file>TypesServlet</welcome-file> </welcome-…...

解密制度的规定和解密工作的具体流程

解密制度是指对于某些敏感的文件或资料,经过一定的时间后,根据相关规定和程序,可以进行解密,解除文件的保密状态,使其可以被公众查阅或利用。解密制度的目的在于确保涉密信息的保密等级与其重要程度相适应,防止涉密信息的泄露和使用不当,同时促进信息公开、传播历史知识…...

实际中常用的网络相关命令

一、ping命令 ping是个使用频率极高的实用程序&#xff0c;主要用于确定网络的连通性。这对确定网络是否正确连接&#xff0c;以及网络连接的状况十分有用。 简单的说&#xff0c;ping就是一个测试程序&#xff0c;如果ping运行正确&#xff0c;大体上就可以排除网络访问层、网…...

机器学习补充

一、数据抽样 数据预处理阶段&#xff1a;对数据集进行抽样可以帮助减少数据量&#xff0c;加快模型训练的速度/减少计算资源的消耗&#xff0c;特别是当数据集非常庞大时&#xff0c;比如设置sample_rate0.8.平衡数据集&#xff1a;通过抽样平衡正负样本&#xff0c;提升模型…...

机器学习——RNN、LSTM

RNN 特点&#xff1a;输入层是层层相关联的&#xff0c;输入包括上一个隐藏层的输出h1和外界输入x2&#xff0c;然后融合一个张量&#xff0c;通过全连接得到h2&#xff0c;重复 优点&#xff1a;结构简单&#xff0c;参数总量少&#xff0c;在短序列任务上性能好 缺点&#x…...

Java项目学习(员工管理)

新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API&#xff0c;其中每个方法的返回值会直接序列化为 JSON 或…...

视觉SLAM14精讲——相机与图像3.3

视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1相机与图像3.2 视觉SLAM14精讲——相机与图像3.3 视觉SLAM14精讲相机投影流程双目相机模型 相机投影流程 至此&#xff0c;有关相机三维刚体变换的所有因素已经汇集。…...

【路径规划】基于粒子群结合遗传算法实现机器人栅格地图路径规划

研究方法: 基于粒子群优化算法结合遗传算法的机器人栅格地图路径规划是一种智能算法的应用。它将粒子群优化算法和遗传算法相结合,以寻找最优路径规划解决方案。 研究路线: 理论研究:了解粒子群优化算法和遗传算法的基本原理,并掌握相关的路径规划理论知识。 算法设计:…...

内容安全复习 9 - 身份认证系统攻击与防御

文章目录 基于生物特征的身份认证系统概述基于生物特征的身份认证 人脸活体检测检测方法未解决问题 基于生物特征的身份认证系统概述 作用&#xff1a;判别用户的身份、保障信息系统安全。 是识别操作者身份的过程&#xff0c;要保证其**物理身份&#xff08;现实&#xff0…...

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建 软件版本一、软件安装1、Python安装2、Pycharm安装3、pyside6或pyqt6安装①安装pyside6②安装PyQt6和pyqt6-tools二、Pycharm项目配置1、插件安装2、新建项目以及环境配置3、包管理安装三、在Pycharm中配置PySide61、pyside6 Qt…...

大数据开发语言Scala入门 ,如何入门?

Ai文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的…...

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…...

HCIP-HarmonyOS Device Developer 课程大纲

一&#xff1a;系统及应用场景介绍 1 -&#xff08;3 课时&#xff09; - HarmonyOS 系统介绍&#xff1b;HarmonyOs 定义&#xff1b;HarmonyOS 特征&#xff1b; - 统一 OS&#xff0c;弹性部署&#xff1b;硬件互助&#xff0c;资源共享&#xff1b;一次开发&#xff0c;多…...

蓝桥杯 经典算法题 查找两个总和为特定值的索引

题目&#xff1a; 给定一个数组&#xff0c;找到两个总和为特定值的索引。 例如给定数组 [1, 2, 3, -2, 5, 7]&#xff0c;给定总和 7&#xff0c;则返回索引 [1, 4]。 若有多组符合情况则输出索引对中小索引最小的一组。 题解: 本题可以通过暴力枚举&#xff0c;枚举每两…...

Java | Leetcode Java题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }...

十大机器学习算法深入浅出

本栏目涉及对于回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法的笔记 下面是笔记大纲&#xff0c;具体内容可查看**“十大机器学习算法深入浅出”**专栏&#xff0c;内容持续更新&#xff0c;欢迎订阅专栏和专注我&#xff01; 1…...

【论文笔记】Parameter-Effificient Transfer Learning for NLP

题目:Parameter-Effificient Transfer Learning for NLP 阅读 文章目录 0.摘要1.引言2 Adapter tuning for NLP3 实验3.1 参数/性能平衡3.2 讨论 4.相关工作 0.摘要 克服微调训练不高效的问题&#xff0c;增加一些adapter模块&#xff0c;思想就是固定原始的网络中的参数&…...

Qt异常处理

初步警告:异常安全功能不完整!一般情况下应该可以工作&#xff0c;但类仍然可能泄漏甚至崩溃。 Qt本身不会抛出异常。而是使用错误码, 但是C可能会抛出异常。此外&#xff0c;有些类有用户可见的错误消息&#xff0c;例如QIODevice::errorString()或QSqlQuery::lastError()。这…...

【ElasticSearch】ElasticSearch实战

初步检索 检索 ES 信息 1&#xff09;、GET /_cat/nodes&#xff1a;查看所有节点 127.0.0.1 44 83 1 0.01 0.01 0.00 dilm * 1b06a843b8e3 *代表主节点 2&#xff09;、GET /_cat/health&#xff1a;查看健康状况 1718265331 07:55:31 elasticsearch yellow 1 1 4 4 0 0…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...