LINUX 变量的扩展应用

问题
本案例要求进一步熟悉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 ~]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值