走进 shell script - 变量

什么是 shell

通俗地来讲,shell 就是操作系统提供给用户和内核交流的一种命令解释器,它可以互动地解释用户输入的命令,并加以处理。

什么是 shell 脚本

用户可以通过分支、循环等,将基本的命令组织起来,以达到想要达到的目的。
对于一些普通的工作,shell 脚本是优雅的。而且 shell 本身也比较容易学习。

shell 脚本的优缺点

优点:

  • 简单易学
  • 依靠强大的命令,开发效率高(这也是代码重用性的一种体现吧)
  • 解释型语言,不需要编译

缺点:

  • 解释型语言的通病,占用资源多,效率不高等
  • 弱类型语言,不会协助类型检查

其实 shell 已经足够快了,不必纠结于效率的问题。

为什么要学习 shell 脚本

对于 Linux 的管理人员来说,shell 脚本编程是必备技能。
作为一种编程语言,不敢说以后会不会用到,但是多了解一门语言总是好的。
况且 shell 是如此的简单~

开始写 shell 脚本

第一个 shell 脚本

学习编程语言,第一个例子总会是输出 Hello, World!

创建一个名为hello_world.sh的文件并键入以下代码:

#!/bin/bash
echo "Helllo, World!"

执行这个脚本有两种方式:

  1. 使用 sh 命令,并以文件名为参数,sh hello_world.sh
  2. 给文件添加执行权限,直接执行 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,我们便把 /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 查看。