看标题大家应该知道,这是一个关于 Linux Shell 脚本的系列文章。通过本系列文章希望帮助 Linux 初学用户快速开始上手编写 Shell 脚本,能够利索的对脚本进行测试和使用。
在接下来的首篇文章中,我们将介绍什么是 Shell,有哪些 Linux Shell 类型,什么是 Shell 脚本以及如何编开始写自己的 Shell 脚本等内容。
什么是(Unix) Shell
Unix Shell 即大家俗称的 Shell 是源于 Unix/Linux 的命令行解释器,用户在 Shell 中执行的一系列命令都会被 Shell 命令行解释器直接执行。现代流行的命令行解释功能都已被内置到 Linux Shell 中进行支持,例如:通配符、 管道、 变量、条件操作、 命令及帮助文件等。简单来说,我们可以把 Linux 理解为用户与 Linux 操作系统进行交互的一个接口。
常见Shell类型
Linux 中的各种 Shell 类型有很多,但 Bourne Shell 和 C shell 应用最为广泛,事实上 Bourne Shell 已经成为 Shell 附加功能及一些衍生功能的编码基础。
- Bourne Shell:Bourne shell 又名 sh,在 Linux 中的标准路径为 /bin/sh,它由 Stephen Bourne 编写创建,其之所以如此出名是因为 sh 作为其它 Shell 的大量符号/硬链接而存在。(Bourne Shell 的 License 仍在讨论中。)
- C Shell:C Shell 又名 csh,由 Billy Joy 编写创建并被 BSD Unix 广泛使用。C Shell 引入许多功能来完善交互,如:别名,历史操作,任务控制等。它完全由 C 语言写成,并使用 BSD license。
- Fish:Fish 是友好人机交互的代表,它改变了用户与 Linux Shell 在通用变量、友好错误信息、Tab 补全、语法高亮、智能终端和剪贴板处理等方面的交互方式。(Fish 基于 GPL v2)
- Bourne-Again Shell:作为 GNU 项目的一部分,Bourne-Again Shell 是目前大多数 Linux 发行版和 Mac OS X 默认使用的 Shell。(它主要由 C 语言写成并基于 GPLv3 发布)
其它不太常用的 Linux Shell 还包括:
- Debian Almquist shell 别名 dash
- Korn Shell 别名 ksh
- Z shell 别名 zh
- Busybox
- ……
什么是Shell脚本
Shell 脚本主要由 Linux Shell 解释执行,可被用于自动化的程序执行、文件操作、环境配置等任务,Linux 管理员通常使用 Shell 脚本来执行一些重复性的体力劳动。
Shell 脚本可将多个要执行的命令和任务提交到 Linux Shell 自动执行,而无需用户手动触发。你还可以在单个脚本中将一个命令的输出定义为另一个命令的输入。
总的来说,Shell 脚本编写是 Linux 管理员节省时间和资源的必备技能。
如何编写Shell脚本
在新手阶段,我们比较建议大家使用 gedit、vi/vim、nano 或 Emacs 来编写 Shell 脚本,而不要使用其它 IDE 编辑器。Bash 脚本必需以如下代码作为首行:
#!/bin/bash
上述字符中的 #! 被称为 shebang,后面跟的 /bin/bash 表明要使用 /bin/bash 来执行。除首行(意义特殊)用于指定脚本类型外,其余以 # 打头的内容会被当作注释被 Shell 忽略执行。
脚本写成后,你可将该文件保存成任意扩展名甚至无扩展名,但业界公认惯例以 .sh 作为 Linux Shell 脚本的扩展名,建议大家也别搞特殊。而且要在赋予脚本执行权限之后才能被执行,建议大家采用 775 权限,千万不要 777:
chmod 755 sysgeekdemo.sh
编写首个Shell脚本
打开你使用的文本编辑器,粘贴如下内容:
#!/bin/bash echo "Hello World!"
将其保存成 1st.sh 再执行看看效果:
chmod 755 1st.sh ./1st.sh
执行成功了,是不是非常简单。
下面我们再建立一个 2nd.sh 并粘入如下内容:
#!/bin/bash echo "What is your name?" read a; echo "Hey $a! what is your Favorite Website?" read b; echo -e "That's Nice to know @$a that $b is your favorite Website"
大家看看执行之后发生了什么呢?
- echo 后的「What is your name?」进行了正确输出,随后你输入的名字被存到了变量 a 当中,让命令可以从文件描述符中进行读取。
- echo 后跟的 「Hey $a! what is your Favorite Website?」中的 $a 变量进行了赋值输出,并将输入的网址存入了变量 b,在第三行进行输出。
如此简单!开始上手的感觉非常良好?在 Linux Shell 脚本系列的后续文章中,我们将逐步深入,希望大家玩得开心。