2018-Linux系统基础-linux-07.Shell编程

Shell编程

  • 通常情况下,从命令行每输入一次命令就能够得到系统响应,如果需要一个接一个地输入命令才得到结果,Shell很好地解决了这个问题。

1. 熟悉Shell程序的创建

  1. 命令语言互动式地解释和执行用户输入的命令
  2. 程序设计

1.1. 语法基本介绍

1.1.1. 开头

  1. 必须开头为: #!/bin/bash
  2. #!用来告诉系统它后面的参数是用来执行文件的程序
  3. 使得脚本可执行,需要赋予该文件可执行的权限,使用如下的命令文件才能运行
  4. 命令:chmod u+x [文件名]

1.1.2. 注释

  1. #开头的具体表示注释,直到这一行结束

1.2. 创建一个Shell程序

  1. 放在一个文件中的一系列linux命令和使用程序,在执行的时候,通过linux系统一个接一个地解释和执行每个命令

1.2.1. 创建文件

  1. 在/root目录下使用vi编辑器创建文件date
  2. 命令:
1
2
3
4
5
#!/bin/bash
#filename:date
echo "Mr.$USER,Today is:"
date
ehcho whish you a lucky day!

1.2.2. 设置可执行权限

  1. 创建完date文件后它还不能执行,需要我们给它设置可执行权限,使用如下命令给文件设置权限
  2. 并且查看当前的date文件的可执行权限
1
2
[root@PC-LIUNX~]# chmod u+x/root/date
[root@PC-LINUX~]# ls -l /root/date

1.2.3. 执行Shell程序

  1. 输入整个文件的完整路径执行Shell程序
  2. 需要如下命令:
1
[root@PC-LINUX~]# /root/date

1.2.4. 使用bash命令执行程序

  1. 如果未设置文件的可执行权限,那么我们需要设置bash命令来告诉系统它是一个课执行的脚本,使用如下命令执行Shell程序
1
[root@PC-LINUX~]# bash /root/date

1.3. 显示欢迎界面的Shell程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash 
#filename:welcome
first() {
echo "=============================================="
echo "Hello! Everyone! Welcome to the Linux world。"
echo "=============================================="
}
second()
{
echo "**********************************************"
}
first
second
second
first
  1. 注意函数的定义方式和引用方式

2. Shell变量

  1. Shell也提供说明和使用变量的功能
  2. Shell采用$var的形式来引用名为var的变量的值

2.1. Shell定义的环境变量

  1. Shell在开始执行时就已经定义的一些与系统的工作环境有关的环境变量
  2. 环境变量:
    1. HOME:用于保存用户宿主目录的完全路径名。
    2. PATH:用于保存用冒号分隔的目录路径名。
    3. TERM:终端的类型。
    4. UID:当前用户的识别号。由数字构成。
    5. PWD:当前工作目录的绝对路径名。这个的值随着cd命令变化。
    6. PS1:用户平时的提示符。在root用户下,默认的主提示符是#,在普通用户情况下是$。
    7. PS2:第一行没输完,等待第二行输入的提示符>。
      1. 直接按回车,Shell判断出命令不完整。
      2. 输入\之后,按下回车。
  3. 查看当前系统的环境变量:echo $name

2.2. 用户定义的变量

  1. 用户定义变量:变量名 = 变量值(无$,不然会导致报错)
    1. 赋值过程小红等号量变不能含空格
    2. 如果值本身含有空格,那么用双引号括起来
    3. 建议所有的变量名都大写
  2. 用户引用变量:$name or ${name}
  3. 说明变量是一个特定的值,之后不再改变它的值,语法:readonly 变量名
  4. 任何时候创建的变量都是局部变量,不能被Shell运行的其他命令或Shell程序所利用,如果想要声明为全局的话,语法是:export 变量名||export 变量名=变量值

2.3. 位置参数

  1. 位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数
  2. 位置参数之间是用空格分隔的,程序取第一个位置参数替换程序中的$1
  3. $0是一个特殊的变量,内容是当前Shell程序的文件名,所以其并不是一个位置参数,在显示当前的所有位置参数时不包含$0

2.4. 预定义变量

  1. 所有的预定义变量都是用$和另一个符号组成的。
  2. 已经完成的预定义变量:
    1. $#:位置参数的数量。
    2. $*:所有位置参数的内容。
    3. $?:命令执行后返回的状态。
    4. :当前进程的进程号。

    5. $0:当前执行的进程名。

2.5. 参数置换的变量

  1. Shell提供了参数置换功能以便用户可以根据不同条件来给变量赋不同值
  2. 五种不同形式:
    1. ${variable:-value}如果变量variable存在,则返回其值,否则返回值value
    2. ${variable:=value}如果变量variable存在,则返回其值,否则将value赋值给variable,然后返回值value。
      • 位置参数不可以这样
    3. ${variable:+value}如果变量variable存在,则返回value的值,否则返回空值
    4. ${variable:?value}如果variable存在则返回variable的值,否则把value送到标准错误输出显示,并退出shell程序
    5. ${variable:offset[:length]}其中offset和length都是整数数字,中括号表示可选部分,这种引用范式返回从变量variable的第(offset+1)个字符开始的、长度为length的子串

3. 变量表达式

  1. test是一个Shell程序中的一个表达式,通过Shell提供的if等条件语句相结合可以方便地测试字符串、文件状态和数字。
  2. 语法:test [表达式]
  3. 表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符。

3.1. 字符串比较

  1. 作用:测试字符串是否相等,长度是否为零,字符串是否为NULL
  2. 比较符号:
    1. =:比较两个字符串是否相同,相同则为"是"(0)
    2. !=:比较两个字符串是否相同,不同则为"是"
    3. -n:比较字符串的长度是否大于0,如果大于0则为"是"
    4. -z:比较字符串的长度是否等于0,如果等于0则为"是"
  3. 例7.4含有空格的字符串的比较
  4. 使用test处理含有空格的变量时最好用引号把变量括起来,防止出现错误的结果。

3.2. 数字比较

  1. 使用整数来表示数字比大小
    1. -eq:相等
    2. -ge:大于等于
    3. -le:小于等于
    4. -ne:不等于
    5. -gt:大于
    6. -lt:小于
  2. 显示命令返回的值:echo $?
  3. 返回值为0则为成立

3.3. 逻辑测试

  1. 简单的逻辑测试符号:
    1. !:一个和逻辑值相反的逻辑值
    2. -a:and
    3. -o:or
  2. 结果对应:
    1. 1:否
    2. 0:是

3.4. 文件操作

  1. 文件测试表达式通常是为了测试文件的文件操作逻辑
  2. 测试的符号:(以下均为返回值为"是"的情况)
    1. -d:对象存在且为目录
    2. -f:对象存在且为文件
    3. -L:对象存在且为符号连接
    4. -r:对象存在且可读
    5. -s:对象存在且长度非0
    6. -w:对象存在且可写
    7. -x:对象存在且可执行
    8. !:测试条件的否定

4. Shell程序的执行和跟踪

  1. Shell程序是解释执行的,并不需要编译成目的程序。

4.1. Shell程序的执行和调试

  1. #! /bin/bash的解释:
    1. #:表示这一行是指注释
    2. !:表示Shell运行感叹号之后的命令并用文档的其余部分作为输入,也就是运行/bin/bash并让其执行Shell程序的内容。
  2. Shell程序的执行:
    1. 方式一:bash [Shell程序文件名]
      • 实际是调用一个新的bash命令解释程序,而把Shell程序文件名作为参数传递给它。
    2. 方式二:bash< [Shell程序文件名]
      • 这种方式是输入重定向,将Shell命令解释程序的输入取自指定的程序文件。
    3. 方法三:使用chmod命令使Shell程序成为可执行的然后运行
      1. 一个文件能够运行取决于该文件的内容本身是否可执行且该文件是否具有执行权
    4. 针对三种方式的选择:
      1. 刚创建时,推荐使用方式一进行调试
      2. 调试好后,使用第三种方式将其固定下来,以后只要输入相应的文件名即可
  3. Shell程序的调试:
    1. 调用bash的形式是:bash [选项][Shell程序文件名]
      1. -e:如果一个命令失败就立即退出
      2. -n:读入命令但是不执行他们
      3. -u:置换时把未设置的变量看做出错
      4. -v:当读入Shell输入行时,把它们显示出来。
      5. -x:执行命令时把命令和他们的参数显示出来。
    2. 以上所有选项也可以在Shell程序内部使用"set -选项"的形式引用,而"set +选项"则将禁止该选项起作用。
    3. 在Shell运行时,若遇到不存在或不可执行命令,复位失败或命令非正常结束等情况时,如果未经重新定向,该错误会显示在终端,但是程序不会停止。

4.2. Shell程序的跟踪:

  1. 主要方法:利用Shell命令解释程序的"-v"或"-x"选项来跟踪程序的执行。
    1. -v:选项是Shell在执行程序的过程中,把它读入的每一个命令行都显示出来。
      • 无该选项:显示命令行的原始数据;有该选项:显示替换后的命令行。
    2. -x:选择项使Shell在执行程序的过程中吧它执行的每一个命令在行首用一个+加上命令名显示出来,并把每一个变量和该变量所取的值也显示出来。

5. Shell流程控制语句

  1. 和其他高级程序设计语言一样,Shell提供了用来控制程序和执行流程的命令。

5.1. 条件判断

5.1.1. if语句

  1. Shell程序中的条件分支是通过if条件语句来实现,其一般格式有if-then语句和if-then-else语句
  2. if-then语句:
1
2
3
4
if 命令行1
then
命令行2
fi
  1. if-then-else语句:
1
2
3
4
5
6
7
if 
命令行1
then
命令行2
else
命令行3
fi

5.1.2. case语句

  1. 从多个选项中选择一项
  2. 例子
1
2
3
4
5
6
7
8
case string in
1) ...
2) ...
.
.
.
*) ...#其他情况
esac
  1. 其中可以使用通配符

5.2. 循环控制

  1. for语句、while语句和until语句
  2. Shell内置的true为0,false为非0

5.2.1. for语句

1
2
3
4
for 变量名 [in 数据列表]
do
若干命令行
done
  1. 变量名可以使任意字符串,则会把数据列表中的值按照顺序替换进变量名进行操作。

5.2.2. while语句

1
2
3
4
5
while 
若干个命令行1
do
若干个命令行2
done
  1. 例子解释:乘号需要转义

5.2.3. util语句

1
2
3
4
5
until 
若干个命令行1
do
若干个命令行2
done
  1. 另一种循环,和while相似,但是是在条件为假的时候才继续循环

2018-Linux系统基础-linux-07.Shell编程
https://spricoder.github.io/2018/07/16/2018-Linux-system-basics/2018-Linux-system-basics-linux-07.Shell%E7%BC%96%E7%A8%8B/
作者
SpriCoder
发布于
2018年7月16日
许可协议