如何系统地学习Shell编程学习指南?

看了很多的Shell学习计划,但是最后都没有完成,下面说说我们马哥Linux学习社群的一个人的经历。

引言:什么是Shell?

Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?
Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。

1.Shell的分类

Linux 的命令 shell 是与操作系统相分离的一层。不同的 shell 环境影响您具备不同的功能,比如可编辑的命令行和历史命令回查等。shell 还决定了脚本中函数的语法。
下面就列举几个常用的Shell:
1.  bash
bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,包括许多附加的特点。Bash 有可编辑的命令行,可以回查历史命令,支持 tab 键补齐以使用户避免输入长的文件名。
2.  csh
C shell 使用的是“类C”语法,借鉴了 Bourne shell 的许多特点,只是内部 shell 命令集有所不同。
3.  ksh
Korn shell 的语法与 Bourne shell 相同,同时具备了 C shell 的易用特点。许多安装脚本都使用 ksh ,即使您不把它作为您的主 shell,您也应该在系统中安装它。
4.  tcsh 
TC shell 是 C shell 的一个增强版本,与 C shell 完全兼容。
5.  zsh
Z shell 是 Korn shell 的一个增强版本,具备 bash shell 的许多特色。
> 默认的 shell 是每个用户帐号的一个参数。Linux 中典型的默认 shell 是 /bin/bash,不过也可以用其他的 shell。每个 shell 的 man 文档实际上都非常好,都对各种 shell 及其使用进行了详细的说明。

一:起因

(0)也许由于一时的冲动使得你开始关注并学习shell编程;亦许由于是“道听途说”shell的威力很大;亦许由于shell编程的魅力;亦许由于作为一个coder的偏好;亦许……

(1)先来搞清楚为什么要学shell,学习要有目的性 ---- 简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。

shell简单、灵活、高效,特别适合处理一些系统管理方面的小问题

shell可以实现自动化管理,让系统管理员的工作变得容易、简单、高效

shell可以把一些经常需要用的命令或者操作,以文件的形式存储起来,每一次调用即可,不用重复的键入命令

shell脚本可移植性好,在unix/Linux系统中可灵活移植,几乎不用任何设置就能正常运行

shell脚本可轻松方便读取和修改源代码,不需要编译 掌握shell可以帮你解决一些故障问题,比如脚本引起的故障问题

掌握shell是一个中级以上系统工程师必需要会的 掌握shell是你系统管理进阶的必经之路

掌握shell是你面试更高级职位的一块敲门砖

(2)那什么时候不使用Shell 脚本?

资源密集型的任务,尤其在需要考虑效率时(比如排序,hash 等)

需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)

有跨平台移植需求(一般使用C 或Java) 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)

对于影响系统全局性的关键任务应用。 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等. 项目由连串的依赖的各个部分组成。

需要大规模的文件操作 或 需要多维数组的支持 需要数据结构的支持,比如链表或数等数据结构

需要产生或操作图形化界面 GUI 需要直接操作系统硬件 需要 I/O 或socket 接口

需要使用库或者遗留下来的老代码的接口 私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)

如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧--或许是Perl,Python,Ruby, 或者是更高层次的编译语言比如C/C++,Java

二:知识点介绍

(1)从脚本编写和执行开始 —— 编写用vim即可,保存为filename.sh文件即可;执行前需要更改为可执行文件或者sh filename.sh来执行:

1)通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh则指明使用bash执行。 #!bin/bash ls -l 通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是为shell脚本加上可执行权限并执行,第二种是通过sh命令执行shell脚本,例如执行当前目录下的run.sh脚本,命令如下: //为shell脚本直接加上可执行权限并执行 chmod 755 run.sh ./run.sh

2)//通过sh命令执行shell脚本

sh run.sh 注意:那为何『 sh shell.sh 』也可以运行呢? 这是因为 /bin/sh 其实就是 /bin/bash(连结档),使用 sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令的意思,所以此时你的 shell.sh 只要有 r 的权限即可被运行喔!而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确呢 sh -x filename.sh 这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。 (2)下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样

sudo vim hello.sh:

#!/bin/sh #print hello world in the console window a="hello world" echo "Hi, ${a}s"

chmod 755 hello.sh 更改为可执行文件 rwx(4,2,1)

sh hello.sh 或者 ./hello.sh
(3)shell里的特殊字符

和其他编程语言一样,shell里也有特殊字符。常见的有美元符号($),反斜线(\)和引号。

1)美元符号

美元符号表示变量替换,即用其后面指定的变量的值来代替变量。反斜线“\”为转义字符,转义字符告诉shell不要对其后面的那个字符进行特殊处理,只是当做普通字符。

2)双引号(")

由双引号括起来的字符,除$,倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。 3)单引号(') 由单引号括起来的字符都作为普通字符出现。

4)倒引号(`) tab键上面那个原始字符

由倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个引号部分。

5)示例

示例1的代码及输出如下: #echo "My current directory is `pwd` and logname is $LOGNAME"【双引号中的倒引号和美元符号保持原来的功能】 My current directory is /root and logname is root 示例2的代码及输出如下: #echo "My current directory is `pwd` and logname is \$LOGNAME"【双引号中的转义字符保持原来的功能】 My current directory is /root and logname is $LOGNAME 示例3的代码及输出如下: #echo 'My current directory is `pwd` and logname is $LOGNAME'【单引号里面的内容不变】 My current directory is `pwd`and logname is $LOGNAME

6)变量

shell的变量非常类似于JS 和 Python,不用声明;但是有一点需要注意,变量和等号(即等号前后无任何空格)如 num=10;但是if [ ${num} eq 10 ];then …… fi 这其中的空格必须得有的

(4)shell脚本的注释

shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。 例如以下脚本: #!/bin/sh #Filename: comment.sh #Description:this script explains how to make a comment echo “This script explains how to make a comment ”

创建脚本时,脚本的第一行通常称为shbang(#!)行。当脚本启动后,UNIX内核检查文件的第一行以决定将要执行的程序类型。

shbang符号(#!)后面的路径是用来解释此脚本的shell位置。要正确使用这个特性,#!必须是文件中最前面的两个字符。如果 文件头部有空格字符或者空白行,则此特性被忽略,该行被解释为普通的注释行。

(5)再看sh脚本执行的奥秘

打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
输入一些代码:
#!/bin/bash
echo "Hello World !"
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令(最好用$printf ""具有更好的可移植性)用于向窗口输出文本。
将上面的代码保存为test.sh,并 cd 到相应目录:

chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本

注意,一定要写成./test.sh,而不是test.sh。运行其它二进制的程序也一样,直接写test.sh,Linux系统会去PATH里寻找有没有叫test.
sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。
这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。

三:体会心得

(1)简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。
例如:你用c编写一个工程,里面有很多.h文件,.c文件等等,每一次更改你都得需要重新 g++ filenames.c filenames.h -o filenames,过于麻烦,这时就需要编写一个小小shell文件,就可以解决问题了。

(2)记得自己上次写Python的基础学习,应该是一个月前了,这次重新学一个新的语言(脚本语言),间隔的时间非常短;越发的感觉,必须掌握精通一门语言,之后学习其他语言非常容易上手 —— 仅仅是入门,如果想在某一门语言上进阶或者深入,只能说“路漫漫其修远兮亦”!

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!