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!"
执行这个脚本有两种方式:
  1. 使用 sh 命令,并以文件名为参数,sh hello_world.sh
  1. 给文件添加执行权限,直接执行 chmod +x hello_world.sh; ./hello_world.sh
shell 文件通常以 .sh 结尾,不加后缀也是可以的,为了区分还是加上。
shell 以 # 开头为注释,第一行的说明是说明让哪个解释器来执行此脚本。
查看系统的 shell 可以通过查看 /etc/shells 文件。
我比较中意 bash,是因为我中意 GNU。
echo 命令可以输出双引号中的字符串并自动添加换行符,如果不想换行可以加上 -n 参数。
是不是觉得很简单?完全可以理解了吧?
shell 没有那么复杂,虽然它是用 C 语言来实现的。它不需要你在一开始就弄懂什么是 includemain(),返回值。

变量

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便/etcPATH/etc/profilePATH=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 查看。

© Xinyu 2014 - 2024