常见的Shell 类型

Shell(壳)是一种用C语言编写的程序(命令解析器),是用户连接Unix/Linux内核的桥梁,它通过调用系统核心的大部分功能的形式向用户隐藏了系统的底层细节,它通过建立文件的形式并行的运行多个程序,来帮助用户完成很多工作。

       Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它类似于Windows下的cmd.exe,可以交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,但是Shell是不需要进行编译的,它是从脚本程序中一行一行的读取并执行命令。

Shell是Linux学习过程中很重要的一部分,它有两种执行命令的方式:交互式(Interactive),用户输入一条命令,Shell就解释执行一条;批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

 

Linux系统下有多种Shell可以供我们选择,常见的有Bourne Again Shell (简称bash)、Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)。我们

可以通过查看/etc/shells文件中的内容来查看当前主机中包含哪些类型的Shell,例如:通过 cat /ect/shells,看到了下面的内容:


我们还可以通过echo $SHELL 命令来查看当前使用的Shell类型。

下面我们进行一些常见Shell的讲解:
 (1) BourneShell(sh):是由AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。

(2) BourneAgain Shell (bash):是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

(3) ash:ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

(4) CShell(csh):是加州伯克利大学的Bill Joy为BSD Unix开发的,共有52个内部命令,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。

(5) KornShell(ksh):是AT&T Bell实验室的David Korn开发的,共有42 条内部命令,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。

(6) zch:是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell。

       注释:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

### Shell 文件中行尾回车符的处理方法 在 Shell 脚本开发过程中,文件中的行尾回车符可能会引发兼容性问题,尤其是在跨平台环境中(如 Windows 和 Linux 之间传输文件时)。以下是几种常见的解决方法: #### 方法一:使用 `dos2unix` 工具 最简单的解决方案是利用专门设计用于转换文件行结束符的工具——`dos2unix`。该工具能够自动将 DOS/Windows 风格的行尾符(CRLF)转换为 Unix 风格的行尾符(LF)。 ```bash dos2unix filename ``` 此命令会直接修改原始文件的内容[^1]。 #### 方法二:通过 `sed` 替换回车符 如果无法安装额外的工具,则可以通过内置的 `sed` 命令实现相同功能。以下是一个典型的例子: ```bash sed -i 's/\r$//g' filename ``` 上述命令会在原地编辑文件并移除所有的 `\r` 字符。如果不希望覆盖源文件,也可以将其输出到新文件中: ```bash sed 's/\r$//g' filename > newfile ``` 这里 `-i` 参数表示就地替换操作;而正则表达式部分匹配每一行末尾可能存在的回车字符,并将其删除。 #### 方法三:借助 Vim 编辑器设置文件格式 对于熟悉文本编辑器的人来说,在打开目标文件之后切换其行为模式也是一种可行的选择之一。具体步骤如下所示: 1. 打开终端运行vim加载指定文档; ```bash vi filename ``` 2. 输入`:set ff?`查看当前文件使用的换行方式(`ff=fileformat`)。 3. 如果发现不是Unix风格的话,请继续执行下一步骤更改它为所需的类型: ```bash :set fileformat=unix ``` 4. 最终保存所做的改动即可完成整个过程. ```bash :wq ``` #### 方法四:采用 `tr` 删除特定控制码 另一种轻量级替代方案涉及管道机制配合翻译实用程序一起工作。例如下面这个实例展示了如何去除任何多余的CR标记然后再写入另一个位置当中去形成干净版本的数据集副本。 ```bash cat filename | tr -d '\r' > newfile ``` 在这里我们调用了`tr`(translate缩写形式),告诉它要丢弃所有遇到的第一个参数列表里定义好的ASCII序列成员即`\r`,最后重定向结果流至新的存储介质上. #### 判断文件是否以换行符结尾 除了清理现有不必要成分之外有时还需要确认某些条件是否存在比如检查某个给定资源项是不是已经具备标准空白分隔特性等等。为此我们可以运用之前提到过的测试逻辑结构来进行验证动作如下列代码片段所展示那样去做就可以了。 ```bash if test -z "$(tail -c 1 filename)" then echo "File does not end with a newline." else echo "File ends correctly with a newline." fi ``` 这段脚本先读取最后一个字节内容再依据长度判定是否有有效数据残留从而得出结论关于对象状态的信息反馈出来供后续决策参考之用[^2]. ### 总结 以上介绍了多种针对不同场景需求下可选的技术手段来妥善处置由不当编码习惯引起的相关麻烦事态发展情况下的预防措施以及修复策略建议大家根据实际项目环境特点灵活选用合适的方式解决问题达到预期效果目的为止步于此不再赘述更多细节方面的东西留给读者自行探索学习成长空间无限广阔天地任君翱翔驰骋吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值