Linux学习第二十二篇--变量

前言

很基本的一个概念,我们知道计算机一个非常重要的功能就是人机交互,我们在使用计算机的过程中,也通常会依赖到人机交互.
比如,我现在写这篇blog,我写的东西能够实时的展示在编辑框中,这就是一个人机交互的体现.
那么,我们写的shell脚本,也不一定是写死的流程,如果在使用shell运行过程中,我们需要根据用户的选择做出一些反应,应该怎么做呢?

变量相关操作

从键盘上读取用户输入的数据

在我们生活中,有一些阅读类型的APP在我们注册的时候,往往会需要我们输入我们的性别,然后根据我们的性别,向我们推荐适合我们的书籍.
假设,我现在想写一个shell,不需要实现太过复杂的事情,只需要用户输入姓名,我们提示hello {用户名称}即可.
这里我们就需要使用linux的一个命令.
read,read命令可以获取用户通过键盘输入的信息.并将该值赋给一个指定的变量.
read的使用格式大致如下:
read [选项] 变量名称
read有两个常用的参数,一个是p,该参数可以用来在获取用户键入信息的时候,给予提示,一个是-t,该参数指定等待用户键入的时间.
我们通过实践,看一下该命令的具体用法.
首先 ,我们提示用户请输入姓名(please insert your name:)
通过vi我们新建一个shell文件read.sh.
具体内容如下:

然后我们尝试执行该shell.

然后,我们修改一下该shell.让其只等待五秒钟

然后,我们等待五秒钟,会发现不再等待用户输入,继续执行:

ok,这就是获取用户键入数据的方法.

声明变量的类型

如果是学过编程的朋友,应该能够比较容易的理解变量类型这个概念,如果没有学过编程的话,可以大致如下理解一下变量的类型:
我们在生活中,通常会将0-9 这种值称为数字.
而,你好啊/吃了没,这种称之为一句话.
在linux中,数字类型被称为数值型,而一句话这种被称为字符串.
还有一个比较好玩一点的类型叫数组,数组其实也很容易理解,就是存放了一组数据的集合.额...你要是连集合是啥都不知道的话,那....
在shell中定义变量的类型可以通过declare来定义.
declare -a {变量} 可以将一个变量声明为数组类型,这样这个变量就可以用来接收一组数据.
declare -i {变量} 可以将一个变量声明为数值类型.
declare -x {变量}可以将局部变量变成全局变量
declare -r  {变量}可以将变量变为只读,即之后不接修改,不可unset.
在shell中变量默认的类型就是字符串的类型比如

我们明明是想让num等于1+2+3的和,但是结果却变成了字符串,4不4很难受...
这时候,我们就用到了declare -i.

这样,我们就可以得到正确的计算结果了.
至于,数组这个东东,现在木有学分支,循环之类的...好像也木有必要说了...因为说了,也不知道用在啥地方...

删除变量内容

有些时候,我们可能手滑了,给变量添加了一些不需要的信息.比如,我们本来想给环境变量PATH,添加一个路径 /usr/local/java/bin,结果,打错了,将usr拼写成user了....那么我们该如何做呢?
在具体了解解决方案的时候,我们需要先了解一下通配符.
和windows差不多,linux中可以通过*来匹配零个或多个字符.?可以匹配且仅匹配一个字符.
如果学过正则的朋友,肯定了解贪婪型匹配,和非贪婪型匹配.
贪婪型就是尽可能多的匹配符合条件的内容.非贪婪就是尽可能少的匹配符合条件的内容.
但是,这里的贪婪型和非贪婪型的写法和正则还有一些区别,下文会交代.
如果我们需要删除一个变量中的部分内容,一个是从前面开始删除,一个是从后面删除.
在这里,#号表示从前面开始执行,%号表示从后面开始执行,如果将#写成##或者将%写成%%那么匹配内容时将会变成贪婪型匹配.
具体删除变量内容的格式如下:
${变量[#%]{1,2}/需要删除的内容}
${变量[#或者##或者%或者%%]/需要删除的内容}
在使用过程中,我还遇到了一个问题,
我先定义了一个变量path,它的值是:

上面的内容是随便写的,主要差别主要在usr和user上.
假设我通过
echo ${path#:/user/local/java/bin}
这种方式修改内容的时候,发现path的值根本没有变化,也就是说,如果匹配到的内容如果不在起始位置,在没有使用通配符的情况下,这种方式没啥效果.同理通过%从尾部匹配的话,如果不是第一个,也没有效果.

这是一个很尴尬的问题.也是我学习中遇到的问题.
而且目前还木有找到原因....大写的囧...
PS:这里需要注意的是,通过echo ${内容}这种方式,只是会打印出删除后的内容,但是不会真正修改变量变量内容,如果想要真正变更的话,可以使用变量=${变量[#%]{1,2}/需要删除的内容} 这种方式来实现.

替换变量内容

还是前面使用的path变量,我们只需要修改第二个user为usr就好了,其实没有必要完全删除掉所属的全部内容,这时候我们就可以使用替换来实现了.
替换的实现方式也比较简单.
${变量[/或者//]旧内容/新内容}


这个还是比较简单的,这里使用  /旧内容 表示只替换第一个.如果使用 //旧内容则替换全部.
也很简单.

空变量的判断处理方式

在我们使用过程中,常常会判断一个变量是否有值,比如下面这种,

这时候,如果用户过了十秒还是没有输入内容,这是name的值就是空的,这样,如果我们下面需要使用name这个变量,可能就会遇到一些问题.
这是后我们可以通过${变量-默认值}这种形式来给变量指定默认值.
比如:

运行一下试试,

咦!??为什么没有结果!!!!???????????????????
原来,通过 - 这种形式,只能够给未定义的变量赋值,但是却不能给空字符串变量赋值,所以,我们再修改一下下.

注意看一下减号前面多了一个:号
看一下结果.

ok,这样就搞定了~
看一下,书里面说的各种处理空变量的方法.(图取自<<鸟哥的Linux私房菜基础篇>>这本书)

根据学到的内容和上图做一下总结.
首先,我们先理解,当变量内容为空字符串的时候,表示有值,只不过值的内容是空字符而已.
在使用减号的时候,表示是否没有值.如果没有值则获取减号后面的内容.
在使用加号的时候,表示是否有值.如果有值,则使用加号后面的内容.
在使用等号的时候,表示是否有值,如果没有值,则使用加号后面的内容,如果有值则保持不变.
至于这里还有一个问号,有三个判断,第一个如果没有值的话,提示无此变量,否则等同于-.
注意上面的冒号的作用,他的含义是将空字符串当做没有值来处理.
PS,这一块,看书看了好久,可能是我智商不够用吧...理了好久....如果我的理解有问题的话,欢迎提出来...如果这篇blog有幸被人看到的话...





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值