变量的扩展应用"/>
变量的扩展应用
问题
本案例要求进一步熟悉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 $SCHOOL //确认结果
Tarena IT Group
[root@svr5 ~]# NOTE="当前的用户是:$USER" //调用环境变量USER
[root@svr5 ~]# echo $NOTE //查看赋值结果
当前的用户是:root
2)单引号的应用
使用单引号则禁用扩展,位于范围内的特殊字符均视为普通字符。比如,上述NOTE变量的赋值操作若改用单引号,则$USER将原样输出,而不会代替为 /root :
[root@svr5 ~]# NOTE='当前的用户是:$USER'
[root@svr5 ~]# echo $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 ~]#
更多推荐
变量的扩展应用
发布评论