只要我们使用的是任何主流操作系统,那么我们都是在间接地与shell交互。在运行Ubuntu、LinuxMint或任何其他Linux发行版时,我们使用终端与shell交互。在本文中,我们将讨论Linux shell和shell脚本,因此在理解shell脚本之前,我们必须熟悉以下术语:
·内核(Kernel)
·Shell
·终端(Terminal)
推荐学习LINUX应用及核心技术演练课程,参考本课程您将深入的了解Linux,很好的梳理Linux中的概念。
什么是内核?
内核是一个计算机程序,它是计算机操作系统的核心,可以完全控制系统中的一切。它管理Linux系统的以下资源–
·文件管理
·过程管理
·I/O管理
·内存管理
·设备管理等。
人们经常误解,Linus Torvalds开发了Linux操作系统,但实际上,他只负责Linux内核的开发。
完整的Linux系统=内核+GNU系统实用程序和库+其他管理脚本+安装脚本。
什么是Shell?
shell是一种特殊的用户程序,为用户提供使用操作系统服务的接口。Shell接受用户的可读命令,并将它们转换为内核可以理解的内容。它是一种命令语言解释器,执行从输入设备(如键盘)或文件读取的命令。shell在用户登录或启动终端时启动。
Shell大致分为两类——
·命令行Shell
·图形化Shell
命令行Shell
用户可以使用命令行界面访问Shell。在Linux/macOS中提供了一个名为Terminal的特殊程序,或在Windows OS中提供的命令提示符,以键入人类可读的命令,如“cat”、“ls”等,然后执行它。然后将结果显示在终端上给用户。Ubuntu 16.4系统中的终端如下所示–
在上面的屏幕截图中,执行带有“-l”选项的“ls”命令。它将以长列表格式列出当前工作目录中的所有文件。
对于初学者来说,使用命令行shell有点困难,因为很难记住这么多命令。它非常强大;它允许用户将命令存储在文件中,并一起执行它们。这样,任何重复的任务都可以轻松地自动化。这些文件在Windows中通常称为批处理文件,在Linux/macOS系统中称为Shell脚本。
图形化Shell(Graphical Shells)
图形Shell通过允许打开、关闭、移动和调整窗口大小等操作,以及在窗口之间切换焦点,提供了基于图形用户界面(GUI)的程序操作方法。Window OS或Ubuntu OS可以被认为是一个很好的例子,它为用户提供了与程序交互的GUI。用户不需要为每个操作键入命令。Ubuntu系统中的典型GUI–
有几种Shell可用于Linux系统,如–
BASH(Bourne Again SHell)–它是Linux系统中使用最广泛的SHell。它在Linux系统和macOS中用作默认登录shell。它也可以安装在Windows操作系统上。
CSH(C SHell)–C SHell的语法及其用法与C编程语言非常相似。
KSH(Korn SHell)–Korn SHell也是POSIX SHell标准规范等的基础。
每个shell执行相同的工作,但理解不同的命令,并提供不同的内置函数。
什么是终端?
一种程序,负责为用户提供一个接口,以便他/她可以访问shell。它基本上允许用户输入命令,并在基于文本的界面中查看这些命令的输出。为自动化和执行复杂任务而编写的大型脚本在终端中执行。
要访问终端,只需在搜索框“终端”中搜索并双击它。
在这里,您可以看到Red Hat Linux的终端外观。
Shell脚本
通常,shell是交互式的,这意味着它们接受命令作为用户的输入并执行它们。然而,有时我们希望定期执行一系列命令,因此我们必须每次在终端中键入所有命令。
由于shell也可以从文件中获取命令作为输入,所以我们可以将这些命令写入文件中,并可以在shell中执行它们,以避免这种重复工作。这些文件称为Shell脚本或Shell程序。Shell脚本类似于MS-DOS中的批处理文件。每个shell脚本都以`.sh`文件扩展名保存,例如myscript.sh。
shell脚本与任何其他编程语言一样具有语法。如果您以前有任何编程语言(如Python、C/C++等)的经验,那么开始使用它将非常容易。
shell脚本由以下元素组成–
·外壳关键词–if、else、break等。
·Shell命令–cd、ls、echo、pwd、touch等。
·功能
·控制流–如果..那么..否则,外壳和外壳循环等。
为什么需要shell脚本?
编写shell脚本有许多原因:
·避免重复工作和自动化
·系统管理员使用shell脚本进行例行备份。
·系统监控
·向外壳添加新功能等。
shell脚本的一些优点
·命令和语法与直接在命令行中输入的命令和语法完全相同,因此程序员不需要切换到完全不同的语法
·编写shell脚本要快得多
·快速入门
·交互式调试等。
shell脚本的一些缺点
·容易发生代价高昂的错误,一个错误就可以改变可能有害的命令。
·执行速度慢
·语言语法或实现中的设计缺陷
·不适合大型复杂任务
·提供与其他脚本语言不同的最小数据结构。等。
使用BashShell编写shell脚本的简单演示
如果您在终端上工作,则需要在目录的深处遍历某些内容。然后,对于路径中接下来的几个目录,我们必须执行如下所示的命令,以访问“python”目录:
这是相当令人沮丧的,所以为什么不可以有一个实用程序,我们只需键入目录的名称,我们可以直接跳到那里,而不必反复执行“cd../”命令。将脚本另存为“jump.sh”
Bash:
# !/bin/bash
# A simple bash script to move up to desired directory level directly
function jump()
{
# original value of Internal Field Separator
OLDIFS=$IFS
# setting field separator to "/"
IFS=/
# converting working path into array of directories in path
# eg. /my/path/is/like/this
# into [, my, path, is, like, this]
path_arr=($PWD)
# setting IFS to original value
IFS=$OLDIFS
local pos=-1
# ${path_arr[@]} gives all the values in path_arr
for dir in "${path_arr[@]}"
do
# find the number of directories to move up to
# reach at target directory
pos=$[$pos+1]
if [ "$1" = "$dir" ];then
# length of the path_arr
dir_in_path=${#path_arr[@]}
#current working directory
cwd=$PWD
limit=$[$dir_in_path-$pos-1]
for ((i=0; i<limit; i++))
do
cwd=$cwd/..
done
cd $cwd
break
fi
done
}
目前,我们无法执行shell脚本,因为它没有权限。我们必须通过键入以下命令使其可执行–
$ chmod +x path/to/our/file/jump.sh
现在,为了在每个终端会话上都可用,我们必须将其放在“.bashrc”文件中。
“.bashrc”是一个shell脚本,每当以交互方式启动时,Bashshell就会运行该脚本。.bashrc文件的目的是提供一个地方,您可以在这里设置变量、函数和别名,定义提示,并定义每当打开新的终端窗口时要使用的其他设置。
现在打开终端并键入以下命令:
$ echo “source ~/path/to/our/file/jump.sh”>> ~/.bashrc
现在打开您的终端,通过键入以下命令来尝试新的“跳转”功能-
$ jump dir_name
就像下面的屏幕截图:
Linux核心技术
在Linux操作系统、vim、shell、docker、k8s的混乱中感到迷失?中培IT学院的LINUX应用及核心技术演练课程将成为您掌握Linux核心应用技巧的终极指南!本课程除了能够使学员掌握Linux Bash Shell脚本编程实践能力、提升对复杂Linux Bash Shell脚本的阅读理解、编写能力以外,还涉及了广泛的Linux核心技术,包括:vim、Linux常见应用环境部署和docker、k8s等的实践技术。课程由业内Linux权威讲师授课,实践与案例穿插进行,为广大学员提供了不可多得的Linux环境时间技术,开拓技术视野。
近期开班:
12月21-23日·杭州
5月27-29日·广州
录播随时可学,可定制入企培训
[1] |