简介
写个博客系统记录自己学习Bash Shell编程的过程。使用环境为Ubuntu 16.04.5 Gnome,使用bash的版本为4.3.48。
如果你想在虚拟机上安装相同的linux系统可以参考之前的文章写给萌新的教程:win10下使用VMware安装Ubuntu16.04.5 Gnome。
在学习shell编程之前,我们需要了解一些相关的概念。我们日常所使用的计算机是有很多硬件组合在一起的复杂的系统,这些硬件如CPU、内存、显卡、声卡、键盘、鼠标、显示器等提供基本的计算资源。对于用户而言,直接使用这些硬件资源是繁琐而又复杂的,因而有了各种各样的应用程序帮助用户更好地使用计算机硬件。当使用计算机硬件时,这些应用程序会发生资源申请冲突,因而需要一个特殊的应用程序管理分配硬件资源的申请和使用。这个特殊的"应用程序"就是操作系统,操作系统一直运行在计算机上(通常称为内核,kernel)。操作系统的内核并不直接为我们提供各种问题的解决方案,它提供了大量的服务供应用程序使用以便更好地利用计算机硬件资源。
那么shell又是什么呢?shell字面意思是外壳,刚好与操作系统的内核相对应,它为用户提供了一个访问操作系统服务的接口。在unix/linux中shell既是一个命令解释器也是一门编程语言。作为一个命令行解释器,shell提供了一个用户接口使用各种各样的实用程序工具(比如coreutils、binutils等),而且shell允许我们将这些程序组合起来使用。现在所使用的shell有很多种,比如sh、csh、ksh、dash、bash、fish、zsh等。在最初的unix系统中使用的shell是sh,并且有一个sh的标准。bash是GNU/Linux系统中默认的shell, 它完全兼容sh,这意味着最新sh语法所写的shell脚本可以不加修改地直接使用bash执行。此外,bash吸收借鉴了csh和ksh中的一些特性,比如作业控制、命令行历史等。
注:之后的shell指的基本上都是bash,特殊情况会另外说明。
shell分为两种运行模式:交互式shell和非交互式shell。交互式shell就是在终端上执行,shell接受从键盘的输入并执行。非交互式shell是指shell执行文件中的命令。
shell也提供了一些内置的命令(称为builtins)实现了一些功能,比如cd,break,continue,exec等。
如何查看shell提供的内置命令呢?可以在终端下执行compgen -b。
结果如下:
compgen -b
# 输出结果如下
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false
fc
fg
getopts
hash
help
history
jobs
kill
let
local
logout
mapfile
popd
printf
pushd
pwd
read
readarray
readonly
return
set
shift
shopt
source
suspend
test
times
trap
true
type
typeset
ulimit
umask
unalias
unset
wait
与任何高级语言一样,shell提供变量,流控制结构,引用和函数。Shell提供了专门用于交互式使用的功能,而不是增强编程语言。这些交互式的功能包括作业控制,命令行编辑,命令历史和别名。
shell的第一个程序
交互式
打开终端输入echo "Hello world"
脚本文件
创建一个文件命名为hello.sh
内容如下:
#!/bin/bash
echo "Hello,world"
如果要直接执行,需要为其添加可执行权限chmod +x ./hello.sh
或者用bash解释运行,bash ./hello.sh