同传统的编程语言一样,Shel!提供了很多特性,这些特性可以使Shel!Scriμt编程更为 有用,如:数据变量、参数传递、判断、流程控制、数据输入(输出和函数等 91. I Shell脚本的建立和执行 Shell i程序是解释执行的 按照 Shell编程的惯例,以bash为例,程序的第一行一般为“#!/ bin/bash 其中#表示该行是注释, 叹号!告诉Shel运行叹号之后的命令,即运行/bin/bash,并让/in/bash去执行Shel|脚 本文件中的内容 执行 Shell程序有3种方法: 方法1 格式: bash shell程序名[参数] 方法 格式:bash< Shell程序名 方法3 用 chmod命令使 Shell程序成为可执行文件 搜索路径(如,/bin、/usr/bin、/sbin、/usr/sbin等) 通过“/Shel程序名”的方式来执行。 912She变量 变量是代表某些值的符号,在计算机语言中可以使用变量进行多种运算和控制。Shll 有四种变量:用户自定义变量,环境变量,预定义变量和位置变量。 1.用户自定义变量 用户定义自己变量的语法规则是:变量名=变量值 在定义变量时,变量名前不应加符号$,在引用变量的内容时则应在变量名前加$:在给 变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用 双引号括起来。在编写 Shell程序时,为了使变量名和命令名相区别,建议所有的变量名都 用大写字母来表示 有条件的变量替换:在bash中可以使变量替换在特定条件下执行,即有条件的变量替 换。这种变量替换总是用大括号括起来的 实例9-2使用用户自定义变量以及变量替换功能 Shell提供了参数置换功能,以便用户可以根据不同的条件来给变量赋不同的值。参数 置换的变量有4种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经 设置,来决定变量的取值,他们的语法和功能见表9-1
同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell Script 编程更为 有用,如:数据变量、参数传递、判断、流程控制、数据输入/输出和函数等。 9.1.1 Shell 脚本的建立和执行 Shell 程序是解释执行的。 按照 Shell 编程的惯例,以 bash 为例,程序的第一行一般为“#!/bin/bash”, 其中#表示该行是注释, 叹号!告诉 Shell 运行叹号之后的命令,即运行/bin/bash,并让/bin/bash 去执行 Shell 脚 本文件中的内容。 执行 Shell 程序有 3 种方法: 方法 1. 格式:bash Shell 程序名 [参数] 方法 2. 格式:bash < Shell 程序名 方法 3. 用 chmod 命令使 Shell 程序成为可执行文件 搜索路径(如,/bin、/usr/bin、/sbin、/usr/sbin 等) 通过“./Shell 程序名”的方式来执行。 9.1.2 Shell 变量 变量是代表某些值的符号,在计算机语言中可以使用变量进行多种运算和控制。Shell 有四种变量:用户自定义变量,环境变量,预定义变量和位置变量。 1.用户自定义变量 用户定义自己变量的语法规则是:变量名=变量值。 在定义变量时,变量名前不应加符号$,在引用变量的内容时则应在变量名前加$;在给 变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用 双引号括起来。在编写 Shell 程序时,为了使变量名和命令名相区别,建议所有的变量名都 用大写字母来表示。 有条件的变量替换:在 bash 中可以使变量替换在特定条件下执行,即有条件的变量替 换。这种变量替换总是用大括号括起来的。 实例 9-2 使用用户自定义变量以及变量替换功能 Shell 提供了参数置换功能,以便用户可以根据不同的条件来给变量赋不同的值。参数 置换的变量有 4 种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经 设置,来决定变量的取值,他们的语法和功能见表 9-1
表9-1参数置换的语法和功能 变量=S{参数word}如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变 量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值 变量=${参数=word}「如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后 再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shel 程序中不能为位置参数赋值 变量=S{参数 ?word}如果设置了参数,则用参数的值置换变量的值,否则就显示word并从She 中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参 数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常 用于出错指示 变量=S{参数+wod}如果设置了参数,则用word置换变量,否则不进行置换 妒实例93使用参数置換功能 2.环境变量 Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的 运行环境(也称为 Shell环境)。而这个环境是由一组变量及其值组成,他们决定了用户环 境的外观,这组变量被称为环境变量。环境变量和 Shell紧密相关,用户可以通过 Shell命 令对自己的环境变量进行修改以达到对环境的要求。环境变量又可以被所有当前用户所运行 的程序使用。对于bash来说,可以通过变量名来访问相应的环境变量,例如:#echo$HOME。 Shell在开始执行时,就已经定义了一些和系统的工作环境有关的变量,用户还可以重 新定义这些变量,也可以通过修改一些相关的环境定义文件来修改环境变量,在RHEL中 与环境变量有关的文件有: letc/profile、/etc/ bashrc、~/ bash profile和~/ bashrc等,修改完毕 后,重新登录或者执行命令 source filename,即可使修改的环境变量生效。 常用的Shel环境变量及其功能见表9-2。 注意: 如果要使用环境变量或其他 Shell变量的值,必须在变量名之前加上一个“$符号,不能直接使 用变量名。显示环境变量的命令有en和set等命令 表9-2环境变量及其功能 环境变量 BASH 当前运行的she的实例的路径名 BASH- VERSINFO shell的版本号 d命令的搜索路径,“”不用单独设置,永远被包含 COLUMNS 终端的列数 EDITOR 器 HOME 用于保存当前用户主目录的完全路径名 HISTFILE 指示当前的bash所用的历史文件 HISTSIZE 历史命令记录数 HOSTNAME 主机的名称 Internal Field Separator,,默认为空格,tb及换行符 LANGUAGE语言相关的环境变量,多语言可以修改此环境变量 LINES LOGNAME 当前用户的登录名 MAIL 当前用户的邮件存放目录 OLDPWD PATH 用于保存用冒号分隔的目录路径名,决定了 shell t将到哪些目录中寻找命令或程序, Shell 3将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一
表 9-1 参数置换的语法和功能 语法 功能 变量=${参数:-word} 如果设置了参数,则用参数的值置换变量的值,否则用 word 置换。即这种变 量的值等于某一个参数的值,如果该参数没有设置,则变量就等于 word 的值 变量=${参数:=word} 如果设置了参数,则用参数的值置换变量的值,否则把变量设置成 word,然后 再用 word 替换参数的值。注意,位置参数不能用于这种方式,因为在 Shell 程序中不能为位置参数赋值 变量=${参数:?word} 如果设置了参数,则用参数的值置换变量的值,否则就显示 word 并从 Shell 中退出,如果省略了 word,则显示标准信息。这种变量要求一定等于某一个参 数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常 用于出错指示 变量=${参数:+word} 如果设置了参数,则用 word 置换变量,否则不进行置换 实例 9-3 使用参数置换功能 2.环境变量 Linux 是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的 运行环境(也称为 Shell 环境)。而这个环境是由一组变量及其值组成,他们决定了用户环 境的外观,这组变量被称为环境变量。环境变量和 Shell 紧密相关,用户可以通过 Shell 命 令对自己的环境变量进行修改以达到对环境的要求。环境变量又可以被所有当前用户所运行 的程序使用。对于 bash 来说,可以通过变量名来访问相应的环境变量,例如:#echo $HOME。 Shell 在开始执行时,就已经定义了一些和系统的工作环境有关的变量,用户还可以重 新定义这些变量,也可以通过修改一些相关的环境定义文件来修改环境变量,在 RHEL 中, 与环境变量有关的文件有:/etc/profile、/etc/bashrc、~/.bash_profile 和~/.bashrc 等,修改完毕 后,重新登录或者执行命令 source filename,即可使修改的环境变量生效。 常用的 Shell 环境变量及其功能见表 9-2。 注意: 如果要使用环境变量或其他 Shell 变量的值,必须在变量名之前加上一个“$”符号,不能直接使 用变量名。显示环境变量的命令有 env 和 set 等命令。 表 9-2 环境变量及其功能 环境变量 功能 BASH 当前运行的 shell 的实例的路径名 BASH_VERSINFO shell 的版本号 CDPATH 用于 cd 命令的搜索路径,“.”不用单独设置, 永远被包含 COLUMNS 终端的列数 EDITOR 编辑器 HOME 用于保存当前用户主目录的完全路径名 HISTFILE 指示当前的 bash 所用的历史文件 HISTSIZE 历史命令记录数 HOSTNAME 主机的名称 IFS Internal Field Separator,默认为空格,tab 及换行符 LANGUAGE 语言相关的环境变量,多语言可以修改此环境变量 LINES 终端的行数 LOGNAME 当前用户的登录名 MAIL 当前用户的邮件存放目录 OLDPWD 上一个工作目录 PATH 用于保存用冒号分隔的目录路径名,决定了 shell 将到哪些目录中寻找命令或程序, Shell 将按 PATH 变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致
的可执行文件将被执行 主提示符,root用户的默认主提示符是“#”,普通用户的默认主提示符是“$ 在She接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回 车,或者当用户按回车键时She判断出用户输入的命令没有结束时,就显示这个 辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“>” 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化 SECONDS 启动的秒数 前用户She类型,也指出She解释程序放在什么地方 TERM UID 当前用户的识别字,取值是由数位构成的字串 3.预定义变量 预定义变量和环境变量类似,也是在 Shell一开始时就定义的变量。所不同的是,用户 只能根据 Shell的定义来使用这些变量,而不能重定义他们。所有预定义变量都是由$符和 另一个符号组成的,常用的 Shell预定义变量及其含义见表9-3 表9-3预定义变量及其含义 预定义变量 当前执行的进程名 后台运行的最后一个进程的进程号(PID) 命令执行后返回的状态,即上一个命令的返回代码,用于检查上一个命令执行是否正确 命令退出状态为0表示该命令正确执行,任何非0值表示命令出错 所有位置参数(命令行参数)的值,即传递给程序的所有参数组成的字符串 位置参数(命令行参数)的数量,即传递给程序的总的参数数目 当前进程的进程号(PD) 使用set及执行时传递给Shel的标志位 所有位置参数(命令行参数)的值,个别的用双引号括起来 4.位置变量 位置变量是一种在调用Shel程序的命令行中,按照各自的位置决定的变量,是在程序 名之后输入的参数。位置变量之间用空格分隔, Shell取第一个位置变量替换程序文件中的 $1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个 Shell i程序的文 件名,所以,$0不是一个位置变量,在显示当前所有的位置变量时是不包括$0的 9.1.3控制She!提示符 可以指定一个或者多个特殊字符作为提示符变量。特殊字符及其含义见表94 表9-4特殊字符及其含义 特殊字符 显示该命令的历史记录编号 显示当前命令的命令编号 示$符作为提示符,如果用户是root的话,则显示#号 示反斜杠 12小时制时间,带 dhH 日期,格式为: weekday month date 主机名的第一部分(第一个“.”前面的部分) 主机名的全称
的可执行文件将被执行 PS1 主提示符,root 用户的默认主提示符是“#”,普通用户的默认主提示符是“$” PS2 在 Shell 接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回 车,或者当用户按回车键时 Shell 判断出用户输入的命令没有结束时,就显示这个 辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“>” PWD 当前工作目录的绝对路径名,该变量的取值随 cd 命令的使用而变化 SECONDS 启动的秒数 SHELL 前用户 Shell 类型,也指出 Shell 解释程序放在什么地方 TERM 终端的类型 UID 当前用户的识别字,取值是由数位构成的字串 3.预定义变量 预定义变量和环境变量类似,也是在 Shell 一开始时就定义的变量。所不同的是,用户 只能根据 Shell 的定义来使用这些变量,而不能重定义他们。所有预定义变量都是由$符和 另一个符号组成的,常用的 Shell 预定义变量及其含义见表 9-3。 表 9-3 预定义变量及其含义 预定义变量 含义 $0 当前执行的进程名 $! 后台运行的最后一个进程的进程号(PID) $? 命令执行后返回的状态,即上一个命令的返回代码,用于检查上一个命令执行是否正确, 命令退出状态为 0 表示该命令正确执行,任何非 0 值表示命令出错 $* 所有位置参数(命令行参数)的值,即传递给程序的所有参数组成的字符串 $# 位置参数(命令行参数)的数量,即传递给程序的总的参数数目 $$ 当前进程的进程号(PID) $- 使用 set 及执行时传递给 Shell 的标志位 $@ 所有位置参数(命令行参数)的值,个别的用双引号括起来 4.位置变量 位置变量是一种在调用 Shell 程序的命令行中,按照各自的位置决定的变量,是在程序 名之后输入的参数。位置变量之间用空格分隔,Shell 取第一个位置变量替换程序文件中的 $1,第二个替换$2,依次类推。$0 是一个特殊的变量,它的内容是当前这个 Shell 程序的文 件名,所以,$0 不是一个位置变量,在显示当前所有的位置变量时是不包括$0 的。 9.1.3 控制 Shell 提示符 可以指定一个或者多个特殊字符作为提示符变量。特殊字符及其含义见表 9-4。 表 9-4 特殊字符及其含义 特殊字符 说明 \! 显示该命令的历史记录编号 \# 显示当前命令的命令编号 \$ 显示$符作为提示符,如果用户是 root 的话,则显示#号 \\ 显示反斜杠 \@ 12 小时制时间,带 am/pm \d 日期,格式为:weekday month date \h 主机名的第一部分(第一个“.”前面的部分) \H 主机名的全称
回车和换行 mst 当前用户使用的shl的名字 时间,格式为 hh mmss,24小时格式 时间,格式为 hh mm'ss,12小时格式 当前用户的用户名 shell的版本号 hell的版本号(包括补丁级别) 当前的工作目录 [root@localhost sh script PSI=\s-IvLS 设置了PSI的值(PSl=s-vs)后,命令行提示符变成“bash-3.2#”,如下行: bash-3.2#echo SPS1 \s-\vS bash-3.2PS I=Tu@h WI 重新设置了PS1的值(PSl= u@h WIs")后,命令行提示符变成“ root@localhost sh script]”,如下行 root@localhost sh script]# echo $PSI Tu@hIW oot @ localhost sh script 请读者结合表94对上面内容进行分析。 914测试命令 与传统语言不同的是, Shell不是用布尔运算表达式来指定条件值,而是用命令和字符 串。使用test命令进行条件测试格式:test测试表达式 test命令在以下4种情况下使用: 1.两个整数值的比较; 2.字符比较; 3.文件操作,如文件是否存在及读写权限等状态 4.逻辑操作,可以进行逻辑“与”,“或”操作,通常与其他条件联合使用。常用的测 试符及其相应的功能见表9-5。 表9-5测试符及其相应的功能 串测试 文件测试 则为真-b文件名[如果文件存在且为块特殊文件,则为真 ge大于等于,则|= 不相等,则为文件名如果文件存在且为字符型特殊文件,则 为真 g大于,则为真|z字字串长度为|d文件名「如果文件存在且为目录,则为真 零,则为真 小于等于,则n 字串长度不为e文件名如果文件存在,则为真 串 零,则为真 t小于,则为真 f文件名如果文件存在且为普通文件,则为真 不等于,则为 文件名如果文件存在且可读,则为真 s文件名如果文件存在且至少有一个字符,则为 w文件名如果文件存在且可写,则为真
\n 回车和换行 \s 当前用户使用的 shell 的名字 \t 时间,格式为 hh:mm:ss ,24 小时格式 \T 时间,格式为 hh:mm:ss,12 小时格式 \u 当前用户的用户名 \v shell 的版本号 \V shell 的版本号(包括补丁级别) \W 当前的工作目录 [root@localhost sh_script]# PS1='\s-\v\$' 设置了 PS1 的值(PS1='\s-\v\$')后,命令行提示符变成“bash-3.2#”,如下行: bash-3.2#echo $PS1 \s-\v\$ bash-3.2#PS1='[\u@\h \W]\$ ' 重新设置了 PS1 的值(PS1='[\u@\h \W]\$ ')后,命令行提示符变成“[root@localhost sh_script]”,如下行: [root@localhost sh_script]# echo $PS1 [\u@\h \W]\$ [root@localhost sh_script]# 请读者结合表 9-4 对上面内容进行分析。 9.1.4 测试命令 与传统语言不同的是,Shell 不是用布尔运算表达式来指定条件值,而是用命令和字符 串。使用 test 命令进行条件测试格式:test 测试表达式。 test 命令在以下 4 种情况下使用: 1.两个整数值的比较; 2.字符比较; 3.文件操作,如文件是否存在及读写权限等状态; 4.逻辑操作,可以进行逻辑“与”,“或”操作,通常与其他条件联合使用。常用的测 试符及其相应的功能见表 9-5。 表 9-5 测试符及其相应的功能 数值测试 字串测试 文件测试 选项 功能 选项 功能 选项 功能 -eq 等于,则为真 = 等于,则为真 -b 文件名 如果文件存在且为块特殊文件,则为真 -ge 大于等于,则 为真 != 不相等,则为 真 -c 文件名 如果文件存在且为字符型特殊文件,则 为真 -gt 大于,则为真 -z 字 串 字串长度 为 零,则为真 -d 文件名 如果文件存在且为目录,则为真 -le 小于等于,则 为真 -n 字 串 字串长度不为 零,则为真 -e 文件名 如果文件存在,则为真 -lt 小于,则为真 -f 文件名 如果文件存在且为普通文件,则为真 -ne 不等于,则为 真 -r 文件名 如果文件存在且可读,则为真 -s 文件名 如果文件存在且至少有一个字符,则为 真 -w 文件名 如果文件存在且可写,则为真
水文件名如果文件存在且可执行,则为真 实例94使用测试命令 4.逻辑操作 在 Shell脚本中,一般情况一条命令占一行,但有时也可以多条命令在一行中,他们可 能顺序执行,也可能在相邻的命令之间存在逻辑关系 (1)&& 格式为: command 1&& command2。 在一个命令行中,命令之间也可以用逻辑“与”操作符“&&”连接起来,实现命令执 行时的逻辑“与”运算。仅当前一条命令执行成功时才执行后一条命令 (2)‖ 格式为: commandl lI command2 在一个命令行中,命令之间也可以用逻辑“或”操作符“‖”连接起来,实现命令执行 时的逻辑“或”运算。仅当前一条命令执行出错时才执行后一条命令。 (3)混合逻辑 混合逻辑格式1: command1&& command2&& command3 仅当 command 1, command2执行成功时才执行 command3 混合逻辑格式2: command1&& command2 I comamnd3。 仅当 command1执行成功, command2执行失败时才执行 command3 读者可以根据实际需要进行多种条件命令的组合。 5.进行test测试的标准方法 因为test命令在Shll编程中占有很重要的地位,为了使She!能同其他编程语言一样 便于阅读和组织,bash在使用test测试时使用了另一种方法,用方括号将整个test测试括起 来。格式为:[test测试 注意 ["后与""前一定要有空格 91.5算术运算 bash提供了简单的整数算术运算,格式为:S[表达式] 表达式是由整数,变量和运算符组成的有意义的式子 bash也提供3种逻辑运算符。可以将命令连接起来,分别为:逻辑非””,逻辑与”&& 和逻辑或。他们的优先级为:””最高,”&&”次之,”最底 bash也允许使用圆括号使一个表达式成为整体,圆括号优先级最高。 实例95进行算术运算
-x 文件名 如果文件存在且可执行,则为真 实例 9-4 使用测试命令 4.逻辑操作 在 Shell 脚本中,一般情况一条命令占一行,但有时也可以多条命令在一行中,他们可 能顺序执行,也可能在相邻的命令之间存在逻辑关系。 (1)&& 格式为:command1 && command2。 在一个命令行中,命令之间也可以用逻辑“与”操作符“&&”连接起来,实现命令执 行时的逻辑“与”运算。仅当前一条命令执行成功时才执行后一条命令。 (2)|| 格式为:command1 || command2。 在一个命令行中,命令之间也可以用逻辑“或”操作符“||”连接起来,实现命令执行 时的逻辑“或”运算。仅当前一条命令执行出错时才执行后一条命令。 (3)混合逻辑 混合逻辑格式 1:command1 && command2 && command3。 仅当 command1, command2 执行成功时才执行 command3 混合逻辑格式 2:command1 && command2 || comamnd3。 仅当 command1 执行成功,command2 执行失败时才执行 command3 读者可以根据实际需要进行多种条件命令的组合。 5.进行 test 测试的标准方法 因为 test 命令在 Shell 编程中占有很重要的地位,为了使 Shell 能同其他编程语言一样 便于阅读和组织,bash 在使用 test 测试时使用了另一种方法,用方括号将整个 test 测试括起 来。格式为:[ test 测试 ] 注意: “[”后与“]”前一定要有空格。 9.1.5 算术运算 bash 提供了简单的整数算术运算,格式为:$[表达式] 表达式是由整数,变量和运算符组成的有意义的式子。 bash 也提供 3 种逻辑运算符。可以将命令连接起来,分别为:逻辑非”!”,逻辑与”&&” 和逻辑或”||”。他们的优先级为:”!”最高,”&&”次之,”||”最底。 bash 也允许使用圆括号使一个表达式成为整体,圆括号优先级最高。 实例 9-5 进行算术运算
91.6内部命令 bash命令解释程序包含一些内部命令,内部命令在目录列表时是看不见的,他们由 Shell 本身提供。常用的内部命令有:echo、eval、exec、exit、 export、read、 readonly、 shift、wat 和
9.1.6 内部命令 bash 命令解释程序包含一些内部命令,内部命令在目录列表时是看不见的,他们由 Shell 本身提供。常用的内部命令有:echo、eval、exec、exit、export、read、readonly、shift、wait 和