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,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。 GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接࿰…...
Java基础入门day65
day65 web项目 页面设计 仿照小米官网,将首页保存到本地为一个html页面,再将html页面保存为jsp页面,在项目中的web.xml文件中配置了欢迎页 <welcome-file-list><welcome-file>TypesServlet</welcome-file> </welcome-…...
解密制度的规定和解密工作的具体流程
解密制度是指对于某些敏感的文件或资料,经过一定的时间后,根据相关规定和程序,可以进行解密,解除文件的保密状态,使其可以被公众查阅或利用。解密制度的目的在于确保涉密信息的保密等级与其重要程度相适应,防止涉密信息的泄露和使用不当,同时促进信息公开、传播历史知识…...
实际中常用的网络相关命令
一、ping命令 ping是个使用频率极高的实用程序,主要用于确定网络的连通性。这对确定网络是否正确连接,以及网络连接的状况十分有用。 简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网…...
机器学习补充
一、数据抽样 数据预处理阶段:对数据集进行抽样可以帮助减少数据量,加快模型训练的速度/减少计算资源的消耗,特别是当数据集非常庞大时,比如设置sample_rate0.8.平衡数据集:通过抽样平衡正负样本,提升模型…...
机器学习——RNN、LSTM
RNN 特点:输入层是层层相关联的,输入包括上一个隐藏层的输出h1和外界输入x2,然后融合一个张量,通过全连接得到h2,重复 优点:结构简单,参数总量少,在短序列任务上性能好 缺点&#x…...
Java项目学习(员工管理)
新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或…...
视觉SLAM14精讲——相机与图像3.3
视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1相机与图像3.2 视觉SLAM14精讲——相机与图像3.3 视觉SLAM14精讲相机投影流程双目相机模型 相机投影流程 至此,有关相机三维刚体变换的所有因素已经汇集。…...
【路径规划】基于粒子群结合遗传算法实现机器人栅格地图路径规划
研究方法: 基于粒子群优化算法结合遗传算法的机器人栅格地图路径规划是一种智能算法的应用。它将粒子群优化算法和遗传算法相结合,以寻找最优路径规划解决方案。 研究路线: 理论研究:了解粒子群优化算法和遗传算法的基本原理,并掌握相关的路径规划理论知识。 算法设计:…...
内容安全复习 9 - 身份认证系统攻击与防御
文章目录 基于生物特征的身份认证系统概述基于生物特征的身份认证 人脸活体检测检测方法未解决问题 基于生物特征的身份认证系统概述 作用:判别用户的身份、保障信息系统安全。 是识别操作者身份的过程,要保证其**物理身份(现实࿰…...
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 作为程序员,开发用过最好用的AI工具有哪些? 2 Github Copilot正版的激活成功,终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手,帮助你提高写代码效率 5 Jetbrains的…...
【人机交互 复习】第1章 人机交互概述
人机交互的知识点碎,而且都是文字,过一遍脑子里什么都留不下,但是背时间已经来不及了,最好还是找题要题感吧,加深印象才是做对文科的关键 一、概念 1.人机交互(Human-Computer Interaction,HCI)࿱…...
HCIP-HarmonyOS Device Developer 课程大纲
一:系统及应用场景介绍 1 -(3 课时) - HarmonyOS 系统介绍;HarmonyOs 定义;HarmonyOS 特征; - 统一 OS,弹性部署;硬件互助,资源共享;一次开发,多…...
蓝桥杯 经典算法题 查找两个总和为特定值的索引
题目: 给定一个数组,找到两个总和为特定值的索引。 例如给定数组 [1, 2, 3, -2, 5, 7],给定总和 7,则返回索引 [1, 4]。 若有多组符合情况则输出索引对中小索引最小的一组。 题解: 本题可以通过暴力枚举,枚举每两…...
Java | Leetcode Java题解之第169题多数元素
题目: 题解: 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;} }...
十大机器学习算法深入浅出
本栏目涉及对于回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法的笔记 下面是笔记大纲,具体内容可查看**“十大机器学习算法深入浅出”**专栏,内容持续更新,欢迎订阅专栏和专注我! 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.摘要 克服微调训练不高效的问题,增加一些adapter模块,思想就是固定原始的网络中的参数&…...
Qt异常处理
初步警告:异常安全功能不完整!一般情况下应该可以工作,但类仍然可能泄漏甚至崩溃。 Qt本身不会抛出异常。而是使用错误码, 但是C可能会抛出异常。此外,有些类有用户可见的错误消息,例如QIODevice::errorString()或QSqlQuery::lastError()。这…...
【ElasticSearch】ElasticSearch实战
初步检索 检索 ES 信息 1)、GET /_cat/nodes:查看所有节点 127.0.0.1 44 83 1 0.01 0.01 0.00 dilm * 1b06a843b8e3 *代表主节点 2)、GET /_cat/health:查看健康状况 1718265331 07:55:31 elasticsearch yellow 1 1 4 4 0 0…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
