Shell编程

概述

常用的shell有Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh), 各有优缺点。Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne shell 的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

此处学习的为bash shell

shell脚本的实质

  • shell脚本语言是解释型语言
  • shell脚本的实质-shell命令的有序集合

为什么要使用 ./filename.sh 行shell脚本呢?

普通的shell命令会从标准路径中进行查询,可以通过 echo $PATH 来查询,如果从这些标准路径中查询不到命令,那么就认为是错误的,即是提示命令找不到。所以需要使用 ./

shell变量

shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符。 以$开头的字符在shell中会被解释为变量。 细节问题

  1. 没有类型
  2. 没有空格作为分隔符(与C语言不同,C语言对空格不做任何编译),即"count = 1"为错误的。赋值的时候等号的两边都没有空格。 e.g.
count=1
echo $count
DATE='date'
echo $DATE

shell有以下4种变量:

  • 用户自定义变量
  • 位置变量即命令行参数
  • 预定义变量
  • 环境变量

用户自定义变量

  • 在shell编程种通常使用全大写变量,方便识别 e.g. COUNT=1
  • 变量的调用:在变量前加$ e.g. echo $HOME
  • Linux shell/bash从右向左赋值(变量赋值的时候不用加$,变量调用的时候加$) e.g. Y=y X=$Y echo $X y
  • 使用unset命令删除变量的赋值 e.g. Z=hello echo $Z hello unset Z echo $Z

位置变量

  • $0 与键入的明了了行一样,包含脚本文件名
  • $1,$2,.....$9 分别包含第一个到第九个命令行参数

环境变量

显示所有的环境变量的命令: export 或 env。 常用shell环境变量:

  • $HOME: /etc/passwd文件种列出的用户主目录
  • $IFS: Internal Field Separator,默认为空格,Tab及换行符
  • $PATH: shell默认搜索路径
  • $PS1,$PS2:默认提示符($)及换行提示符(>)
  • $TERM: 终端类型,常用的有vt100,ansi,vt200,xterm等。

功能语句

shell程序与语句

  • shell程序由0或多个shell语句构成。shell语句包括三类:说明性语句,功能性语句和结构性语句。
  1. 说明性语句: 以#开头到该行结束,不被解释执行。
  2. 功能性语句: 任意的shell命令,用户程序或其他的shell程序。
  3. 结构性语句: 条件测试语句、多路分支语句、循环语句、循环控制语句等。

说明性语句(注释行)

  • 注释行可以出现在程序中的开始位置,既可以单独占用一行,也可以接在执行语句的后面。以#开始到所在行的行尾部分,都不被解释执行。e.g.
#!/bin/bash
#
# 本程序说明
#
command_1  #command_1的语句说明
......
command_n  #command_n的语句说明

常用功能性语句(命令)

  • read从标准输入读取一行,并赋值给后面的变量,其语法为:
read var

把读入的数据全部赋给var

read var1 var2 var3

把读入行中的第一个单词(word)赋值给var1,第二个单词赋值给var2,......把其余所有的词赋值给最后一个变量。

  • 如果执行read语句时标准输入无数据,则程序在此停留等等候,直到数据的到来或被终止执行。