Learn Shell Script
什么是 shell
通俗地来讲,shell 就是操作系统提供给用户和内核交流的一种命令解释器,它可以互动地解释用户输入的命令,并加以处理。
什么是 shell 脚本
用户可以通过分支、循环等,将基本的命令组织起来,以达到想要达到的目的。
对于一些普通的工作,shell 脚本是优雅的。而且 shell 本身也比较容易学习。
shell 脚本的优缺点
优点:
- 简单易学
- 依靠强大的命令,开发效率高(这也是代码重用性的一种体现吧)
- 解释型语言,不需要编译
缺点:
- 解释型语言的通病,占用资源多,效率不高等
- 弱类型语言,不会协助类型检查
其实 shell 已经足够快了,不必纠结于效率的问题。
为什么要学习 shell 脚本
对于 Linux 的管理人员来说,shell 脚本编程是必备技能。 作为一种编程语言,不敢说以后会不会用到,但是多了解一门语言总是好的。 况且 shell 是如此的简单~
开始写 shell 脚本
第一个 shell 脚本
学习编程语言,第一个例子总会是输出 Hello, World!
创建一个名为
hello_world.sh
的文件并键入以下代码:#!/bin/bashecho "Helllo, World!"
执行这个脚本有两种方式:
- 使用 sh 命令,并以文件名为参数,
sh hello_world.sh
- 给文件添加执行权限,直接执行
chmod +x hello_world.sh; ./hello_world.sh
shell 文件通常以
.sh
结尾,不加后缀也是可以的,为了区分还是加上。shell 以
#
开头为注释,第一行的说明是说明让哪个解释器来执行此脚本。查看系统的 shell 可以通过查看
/etc/shells
文件。我比较中意 bash,是因为我中意 GNU。
echo
命令可以输出双引号中的字符串并自动添加换行符,如果不想换行可以加上 -n
参数。是不是觉得很简单?完全可以理解了吧?
shell 没有那么复杂,虽然它是用 C 语言来实现的。它不需要你在一开始就弄懂什么是
include
,main()
,返回值。变量
shell 是弱类型语言,所以在定义变量的时候不需要声明类型。
在下文获取这个变量需要在变量名前面加$,取一个为定义过的变量会返回空。
变量的分类
- 普通变量
- 本地变量:只在程序内部作用
- 环境变量:在整个环境中作用,定义之后需要使用
export
命令导出
- 其他变量
- 位置变量:
$0-$9
表示执行脚本时传入的参数,第十个参数以后需要这样,${10}
- 特殊变量:
$?
: 上个变量是否执行成功$*
: 传入的所有参数$#
: 传入的参数个数 对于普通变量来说,它可以成为命令的返回值,比如下面这个显示当前系统时间的脚本:(其实本不需要这么做)
#!/bin/bash
current_time=`date`
echo "Current Time: $current_time"
echo 'Current Time: $current_time'
输出结果跟你预料的一样吗?是的,单引号中得内容被原样输出了。
环境变量,相对于本地变量,在
export
之后可以在每一个 shell 脚本中起作用。 查看系统的环境变量可以使用 env
命令。常见的有 PATH、HOME、USER 等。 在你需要这个环境变量以后,可以使用 unset 命令,取消设置。在这里详细叙述一下 PATH 这个环境变量。
PATH 是一个字符串,其中包含输入命令时操作系统查找的路径。
比如我的 PATH 是:
PATH=/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
我们输入一个命令的时候,操作系统会依次在这些位置查找命令存在的位置。
那么如何修改 PATH 呢?有以下两种方法:
第一种是暂时的。在终端输入:PATH=PATH : /etc,我们便把/etc目录加入了PATH不过重新登录以后就会失效。第二种是永久的。编辑/etc/profile文件,在末尾添加PATH=PATH:/etc ,这样做不会立即生效,
结束编辑后执行 source profile 命令使 PATH 值立即生效。再用一个脚本说明位置变量和特殊变量:
#!/bin/bash
echo "Parama 0: $0"
echo "Parama 1: $1"
echo "Parama 2: $2"
echo "All Paramas: $*"
echo "Count of Paramas: $#"
执行这个脚本并带上两个参数1,2,就像这样
sh var.sh 1 2
结果正如所预料的那样,脚本的名字被当做第0个参数传入,而总共参数的个数是2个。对了,再介绍一个 read 关键字,类似于 C语言的 scanf 用来读取用户输入的信息。
#!/bin/bash
echo -n "Please input something:"
read INPUT
echo "Your input is: $INPUT"
read 默认是读取一行的,更多参数可以通过
man
查看。