4.变量的扩展应用 问题 本案例要求进一步熟悉Shell变量的赋值控制,主要练习或验证下列内容: 1)三种引号对赋值的影响 2)使用read命令从键盘读取变量值 3)使用export发布全局变量 步骤 实现此案例需要按照如下步骤进行。 步骤一:三种引号对变量赋值的影响 1)双引号的应用 使用双引号可以界定一个完整字符串,也允许在范围内通过$调用其他变量的值。大多数情况下双引号可以省略,但包含空格等特殊字符的情况下例外: [root@svr5 ~]# SCHOOL=Tarena IT Group -bash: IT: command not found //未界定时赋值失败 [root@svr5 ~]# SCHOOL=“Tarena IT Group” //界定后成功 [root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 50: …p [root@svr5 ~]#̲ NOTE="当前的用户是:USER" //调用环境变量USER [root@svr5 ~]# echo N O T E / / 查 看 赋 值 结 果 当 前 的 用 户 是 : r o o t 2 ) 单 引 号 的 应 用 使 用 单 引 号 则 禁 用 扩 展 , 位 于 范 围 内 的 特 殊 字 符 均 视 为 普 通 字 符 。 比 如 , 上 述 N O T E 变 量 的 赋 值 操 作 若 改 用 单 引 号 , 则 NOTE //查看赋值结果 当前的用户是:root 2)单引号的应用 使用单引号则禁用扩展,位于范围内的特殊字符均视为普通字符。比如,上述NOTE变量的赋值操作若改用单引号,则 NOTE//查看赋值结果当前的用户是:root2)单引号的应用使用单引号则禁用扩展,位于范围内的特殊字符均视为普通字符。比如,上述NOTE变量的赋值操作若改用单引号,则USER将原样输出,而不会代替为 /root : [root@svr5 ~]# NOTE=‘当前的用户是:$USER’ [root@svr5 ~]# echo N O T E 当 前 的 用 户 是 : NOTE 当前的用户是: NOTE当前的用户是:USER //单引号内的 $ 被视为普通字符 3)反撇号或 ( ) 的 应 用 使 用 反 撇 号 或 ()的应用 使用反撇号或 ()的应用使用反撇号或()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。比如,可以将执行uname -r获得的内核版本信息赋值给变量KVER: [root@svr5 ~]# KVER=uname -r //等效于KVER=$(uname -r) [root@svr5 ~]# echo $KVER 2.6.18-348.el5 再比如,若要查询man命令是哪个软件包提供的,正常应该先执行which man找到man程序的路径,然后再根据这个路径执行rpm -qf查询: [root@svr5 ~]# which man /usr/bin/man [root@svr5 ~]# rpm -qf /usr/bin/man man-1.6d-3.el5 如果采用命令替换,上述要求只需一步即可实现: [root@svr5 ~]# rpm -qf which man //等效于rpm -qf $(which man) man-1.6d-3.el5 步骤二:使用read命令从键盘读取变量值 1)read基本用法 以指定变量名str作为执行参数为例,执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str: [root@svr5 ~]# read str What’s happen ? //随便输入一些文字,按Enter键提交 [root@svr5 ~]# echo $str //查看赋值结果 What’s happen ? 为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示: [root@svr5 ~]# read -p “请输入一个整数:” i 请输入一个整数:240 [root@svr5 ~]# echo $i 240 2)stty终端显示控制 在脚本中若需要用户输入具有隐私性的文本(比如密码),建议将回显功能关闭(stty -echo),避免用户周围的人无意中看到(类似于Linux登录验证的情况);当然,取完变量值以后要记得将回显功能恢复(stty echo)。可参考下列操作创建一个测试脚本: [root@svr5 ~]# vim sttyecho.sh //创建一个测试脚本 #!/bin/bash read -p "localhost login: " USERNAME //读取用户名 stty -echo //关闭回显 read -p "Password: " PASSWORD //读取密码 stty echo //恢复回显 echo “” //恢复回显后补一个空行 echo “Your login name is: $USERNAME” //确认赋值结果 echo “Your password is: $PASSWORD” //确认赋值结果 [root@svr5 ~]# chmod +x sttyecho.sh //添加执行权限 执行测试脚本sttyecho.sh,验证效果: [root@svr5 ~]# ./sttyecho.sh localhost login: root //输入root,回车 Password: //输入1234567(不会显示),回车 Your login name is: root //脚本反馈结果 Your password is: 1234567 步骤三:使用export发布全局变量 默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。比如已定义的SCHOOL变量,当进入到sh或bash子Shell后,变量SCHOOL将处于未定义的状态: [root@svr5 ~]# echo $SCHOOL Tarena IT Group [root@svr5 ~]# sh //开启一个sh子进程 sh-3.2# echo $SCHOOL //查看SCHOOL变量值无结果
sh-3.2# exit //返回原有Shell环境 exit [root@svr5 ~]# bash //开启bash子进程 [root@svr5 ~]# echo $SCHOOL //查看SCHOOL变量值无结果
[root@svr5 ~]# exit //返回原有Shell环境 exit [root@svr5 ~]# 若希望定义的变量能被子进程使用,可以使用export命令将其发布为全局变量。使用export发布时,只需指定变量名(可以有多个)即可,也可以通过export命令直接设置新的全局变量: [root@svr5 ~]# export SCHOOL //发布已定义的变量 [root@svr5 ~]# export XX=“1234” //发布新变量 [root@svr5 ~]# NSD=“Network&System Direction” [root@svr5 ~]# export NSD YY=“5678” //混合式发布 验证刚刚发布的全局变量: [root@svr5 ~]# sh //进入sh子Shell环境 sh-3.2# echo $SCHOOL //查看全局变量的值 … … Tarena IT Group sh-3.2# echo $NSD Network&System Direction sh-3.2# echo $XX $YY 1234 5678 sh-3.2# exit //返回原有Shell环境 exit [root@svr5 ~]# 若要取消全局变量的全局属性,可结合export命令的 -n 选项;若要取消变量,则应使用unset命令。比如,以下操作可将前面发布的SCHOOL、XX恢复成局部变量: [root@svr5 ~]# export -n SCHOOL XX //取消全局变量属性 [root@svr5 ~]# echo $SCHOOL $XX //局部变量SCHOOL、XX仍可用 Tarena IT Group 1234 [root@svr5 ~]# sh sh-3.2# echo $SCHOOL $XX //全局变量SCHOOL、XX已不可用
sh-3.2# exit //返回原有Shell环境 exit [root@svr5 ~]#