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…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
