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

xiaoxiao2021-02-28  106

前言

很基本的一个概念,我们知道计算机一个非常重要的功能就是人机交互,我们在使用计算机的过程中,也通常会依赖到人机交互. 比如,我现在写这篇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有幸被人看到的话...
转载请注明原文地址: https://www.6miu.com/read-23880.html

最新回复(0)