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…...
48-3 内网渗透 - 令牌操纵
访问令牌操纵 Windows 操作系统的访问控制模型是其安全性的重要组成部分,主要由访问令牌(Access Token)和安全描述符(Security Descriptor)构成。访问令牌是访问者持有的,而安全描述符则由被访问对象持有。通过对比访问令牌和安全描述符的内容,Windows 可以判断访问者是…...
架构师之 Kafka 核心概念入门
Kafka 核心概念 作为架构师,理解 Kafka 的核心概念至关重要。这些概念是构建高效、可靠的 Kafka 系统的基础。 以下是需要掌握的 Kafka 核心概念及其详细说明: 1. Topic 定义:Topic 是 Kafka 中用于存储和分类消息的逻辑命名空间。每个 Topic 代表一类数据流, 例如日志、…...
Redis通用命令详解
文章目录 一、Redis概述1.1 KEYS:查看符合模板的所有 key1.2 DEL:删除一个指定的 key1.3 EXISTS:判断 key 是否存在1.4 EXPIRE:给一个 key 设置有效期,有效期到期时该 key 会被自动删除1.5 TTL:查看一个 ke…...
物联网设备安装相关知识整理
拓扑图 对于ADAM-4150先接设备的整体的供电。 ADAM-4150就涉及到几个电子元器件的连接,一个是485-232的转换器,一个是将RS-232转换为USB的转接口,因为现在的计算机很多都去掉了RS-232接口而使用USB接口。 4150右侧有个拨码,分别两…...
React实现H5手势密码
监测应用进入前后台 在JavaScript中,监听H5页面是否在前台或后台运行,主要依赖于Page Visibility API。这个API在大多数现代浏览器中都是支持的,包括苹果的Safari和谷歌的Chrome(也就基本覆盖了Android和iOS平台)。下…...
[leetcode hot 150]第十五题,三数之和
题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复…...
视频AI分析定时任务思路解析
序言: 最近项目中用到视频ai分析,由于sdk涉及保密,不便透露,仅对定时任务分析的思路作出分享,仅供参考。 1、定时任务 由于ai服务器的性能上限,只能同时对64个rtsp流分析一种算法,或者对8个rts…...
tcp 粘包和拆包 及 解决粘包方案
什么是粘包和拆包 .TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使…...
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索20页论文及Python代码
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索20页论文及Python代码 相关链接 【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现 【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码实现 【2024泰迪…...
华为设备telnet 远程访问配置实验简述
一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤: 1、AR1和AR2接口配置IP,实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…...
h5网站源代码/自己如何做网站
本文转载自一位做前端开发的朋友的博客【岁月如歌】,他向学习JavaScript的朋友推荐了很多非常不错的书籍及在线教程,适合英语能力不错的朋友参阅,转载如下: 最近 reddit 有讨论:References for JavaScript Mastery. 去…...
wordpress主题知更鸟美化/网络优化器下载
struts2提供了从页面直接封装到List的功能,实现起来有两个办法 1.使用泛型定义集合中的对象类型2.配合配置文件定义集合中的对象类型 User.java packageHelloWorld;publicclassUser ...{ private String username; private String password; private…...
网站空间租赁 香港/南宁网站seo大概多少钱
山西大同大学数学与计算机科学学院是于2006年在山西大同大学组建后成立的,前身是雁北师范学院数学系。学校坐落于历史文化名城、煤海之乡山西大同。校园占地面积2292.82亩,建筑面积612605.43平方米,中外文藏书180.19万余册,中外文…...
免费的推广平台/seo网站诊断
1、检查系统中是否已安装 MySQL。rpm -qa | grep mysql返回空值的话,就说明没有安装 MySQL 。注意:在新版本的CentOS7中,默认的数据库已更新为了Mariadb,而非 MySQL,所以执行 yum install mysql 命令只是更新Mariadb数…...
网站建设与维护txt下载/seo网络推广到底是做什么的
最近想学习一下iOS开发,不过一点基础都没有,得先从熟悉object-C语法开始,在此把学习中的一些知识点作为记录。 mac pro常用操作 学习ios【1】Objective-C 基本语法 学习ios【2】Objective-C 数字和字符串 学习iOS【3】数组、词典和集合 本文转…...
济南做网站的公司哪家好/ks数据分析神器
最近实现一个算法要用到求逆等矩阵运算,在网上搜到一个别人写的矩阵类,试了一下效果不错,贴在这里,做个保存。 matrix.h文件: 1 #ifndef __MATRIX_H__2 #define __MATRIX_H__3 4 #pragma once5 6 #include <iostrea…...