Linux Shell编程学习笔记(2015-7-12)

分类:linux shell

Shell变量

一:关于Shell变量

  Shell是一种弱类型的语言,变量存储的一切值都是字符串。Shell变量的本质上是一个键值对,即使用一个关键字来记录或引用一个值。和其它强类型的编程语言不同,Shell变量不需要预先定义,或者说赋值即定义,而且可以引用未赋值的变量。在引用一个事先未赋值过值的变量时,该变量为一个空的字符串。
  例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ echo $myNamebiantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"biantiao@lazybone1994-ThinkPad-E430:~$ echo $myNameLazyBone1994biantiao@lazybone1994-ThinkPad-E430:~$ 

  在上面的例子中,myName一开始并没有赋值,但仍然可以对它进行引用,只不过显示的是一个空的字符串。与下面赋值过后的输出形成对比。

注意:当在变量名后面紧跟一个由非空白字符开始的字符串时,为了使变量名和其后的字符串区分开来,应该使用花括号“{}”将变量括起来。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"biantiao@lazybone1994-ThinkPad-E430:~$ cat ${postion}termio.h/* Compatible <termio.h> for old `struct termio' ioctl interface.This is obsolete; use the POSIX.1 `struct termios' interfacedefined in <termios.h> instead.  */#include <termios.h>#include <sys/ioctl.h>

但如果没有使用花括号将产生以下的错误情况,如结果所示如果你不使用花括号而人为地加上空格也将出错:

    biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"biantiao@lazybone1994-ThinkPad-E430:~$ cat $positiontermio.hcat: .h: 没有那个文件或目录biantiao@lazybone1994-ThinkPad-E430:~$ cat $position termio.hcat: /usr/include/: 是一个目录cat: termio.h: 没有那个文件或目录biantiao@lazybone1994-ThinkPad-E430:~$ 

二:Shell变量的两个使用技巧

  • 使用unset命令将一个变量的值清除,例如:
    biantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"biantiao@lazybone1994-ThinkPad-E430:~$ echo $myNameLazyBone1994biantiao@lazybone1994-ThinkPad-E430:~$ unset myNamebiantiao@lazybone1994-ThinkPad-E430:~$ echo $myNamebiantiao@lazybone1994-ThinkPad-E430:~$ 

  可以看到在对变量使用了unset命令后变量值变成了空字符串。
* 使用特殊变量引用 “${#变量名}” 可以得到变量的长度,即字符数。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ str="Hello World!"biantiao@lazybone1994-ThinkPad-E430:~$ echo Length of \"$str\" is ${#str}Length of "Hello World!" is 12biantiao@lazybone1994-ThinkPad-E430:~$ 

三:命令替换

  命令替换是一个将一个或多个命令的执行结果赋给变量的一种方法。实现的方法有两种。一种是使用反引号“ `…` ”。另一种是“ $(…) ”。多个命令之间用分号;来分割。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ str=`pwd; who`biantiao@lazybone1994-ThinkPad-E430:~$ echo $str/home/biantiao biantiao :0 2015-07-14 15:55 (:0) biantiao pts/3 2015-07-    14 17:08 (:0)biantiao@lazybone1994-ThinkPad-E430:~$ 

四:声明变量的属性

  使用declare和typeset来限定变量的属性。常用的变量属性有如下:
* -r 只读
* -i 整数
* -a 数组
* -f 函数
* -x 导出变量

例如:将变量声明为整数,使其可以进行整数的运算。
如果没有将其声明为整数类型,它会是这个样子:

    biantiao@lazybone1994-ThinkPad-E430:~$ a=10biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10biantiao@lazybone1994-ThinkPad-E430:~$ echo $aa+10biantiao@lazybone1994-ThinkPad-E430:~$

将其声明为整数类型时:

    biantiao@lazybone1994-ThinkPad-E430:~$ declare -i a=10biantiao@lazybone1994-ThinkPad-E430:~$ echo $a10biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10biantiao@lazybone1994-ThinkPad-E430:~$ echo $a20biantiao@lazybone1994-ThinkPad-E430:~$

个人思考:shell是一种弱类型的编程语言。如果没有声明变量类型的这种机制,那么使用shell将很难进行数值计算。使用-i是声明整型变量,那么问题来了,shell能否进行浮点运算?如果能,那怎样使用浮点运算?

五:数组变量

  在shell中,数组变量的声明和使用的语法非常简单,和C语言当中的语法类似。要注意的就是,在bash shell 中数组变量支持组合赋值,什么是组合赋值,就是将多个值组合在一起同时赋值给数组中。比如下面的例子。

    biantiao@lazybone1994-ThinkPad-E430:~$ student=(张三 李四 王五 LazyBone1994)biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[0]}张三biantiao@lazybone1994-ThinkPad-E430:~$ echo $student张三biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}LazyBone1994biantiao@lazybone1994-ThinkPad-E430:~$ student[3]=赵六biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}赵六biantiao@lazybone1994-ThinkPad-E430:~$

从上面的例子可以看到,引用没有带下标的数组名student相当于引用下标为0的数组元素student[0]。数组变量的赋值就是将值放在括号里,每个值用空格隔开即可。

  有关数组的几个特殊变量引用
- 使用“数组名[∗]”和“{数组名[*]}”和“{数组名[@]}”来引用数组中所有非空元素。比如:

biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[3]=THU
biantiao@lazybone1994-ThinkPad-E430:~$ week[5]=SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[*]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[@]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$
  • “{#数组名[*]}”和“{#数组名[*]}”和“{#数组名[@]}”表示所引用数组中非空元素的个数。比如:
biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[6]=SUN
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${#week[@]}
4
biantiao@lazybone1994-ThinkPad-E430:~$

Linux Shell编程学习笔记(2)相关推荐

  1. 《Linux Shell编程学习笔记之一》

    <Linux Shell编程学习笔记之一> 前言 由于自己一直在Windows上面编程,用linux用的比较少,学习linux还是本科大二学的一点点知识.因此自己就准备花点时间来熟悉下li ...

  2. Linux Shell编程学习笔记(4)

    Linux Shell编程学习笔记(2015-7-20) 分类:linux shell   今天学习了Linux Shell中的控制结构.其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础 ...

  3. Linux Shell编程学习笔记(3)

    Linux Shell编程学习笔记(2015-7-19) 分类:linux shell 一:位置参数和特殊变量   什么是位置参数?   位置参数也叫位置变量,是运行shell脚本程序时,命令行she ...

  4. Linux Shell 编程学习笔记(1)

    Linux Shell编程学习笔(2015-7-11) 一:Shell程序运行的三种方法 赋予程序文件可执行权限,直接运行   比如:chmod a+x shell.sh 使用命令解释器(即shell ...

  5. Linux Shell编程学习笔记一:shell简介

    Q:什么是Shell,什么是shell脚本? A:Shell是一种用C语言编写的程序,它是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作 ...

  6. Linux Shell编程学习笔记

    1./是根目录,文件夹目录应该是/home/用户名.shell文件只能保存在文件夹中而不能保存在根目录中,可能是没有进入root. 进入root方法:终端输入 sudo su. 运行shell文件方法 ...

  7. Linux shell编程学习笔记-----第六章变量和引用

    6.1变量 变量可分为本地变量(随着shell进程的消亡而消亡,类似于java C++ 中的局部变量),环境变量(适用于所有由登录进程产生的子进程),位置参数(用于向shell脚本传递参数,是只读的) ...

  8. Linux shell编程学习笔记-----第十四章

    14.1别名 bash shell的别名实际上就是为了避免用户使用长命令不方便,所以提出的一种重命名的方法,来帮助用户记录 14.2列表 列表是由一连串命令和与(&&),或(||)运算 ...

  9. linux shell编程学习笔记(9)正则表达式

    1.什么是正则表达式 用一串符号描述有共同属性的数据 一串符号:元符号 --正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.许多程序设计语言都支持利用正则表达式进行字符串操作.对于系统管 ...

最新文章

  1. 干货 | XGBoost在携程搜索排序中的应用
  2. Node 深入Stream(2)
  3. GD32F103内部Flash做虚拟U盘
  4. 在蓄电池管理系统中计算机应用,汽车电器与电子技术.docx
  5. 基类的构造函数也可以被继承_「C++ Primer plus 心得」13.类继承
  6. Consecutive Sum LightOJ - 1269(区间异或和)
  7. Git 将本地的一个分支上的代码合并到本地的另一个分支
  8. Arturia Prophet V3 for Mac(多功能仿真音乐合成器)
  9. 模板引擎thymeleaf和freemarker
  10. mysql 查询和修改组合_MySql语句大全:创建、授权、查询、修改等
  11. Oracle数据库学习
  12. Packet Tracer使用说明
  13. 农户在集市上卖西瓜,他总共有1020个西瓜,第一天卖掉一半多两个,第二天卖掉剩下的一半多两个, 问照此规律实下去,该农户几天能将所有的西瓜卖完。C语言
  14. 分布式部署OpenDevOps报502错问题解决全过程
  15. Web基础(从零开始)——HTML文本域(textarea标签)
  16. 【perl计算基因在基因组上的距离】
  17. java完成九宫格数独_简单实现java数独游戏
  18. 我用“电驴”抓肉鸡(转)
  19. 微信 图片二维码识别不了的问题
  20. 永恒python奇美拉_87级稀有双龙头奇美拉 等到熊猫人时再来抓

热门文章

  1. 【2023注册测绘师考试综合能力考试攻略】 ——工程测量的考点试题汇编及参考答案
  2. Flask 学习-28.flask_jwt_extended插件 JWT 中存储额外数据(additional_claims)
  3. 人才招聘①期 | 中国电信IT研发中心招聘多个职位
  4. java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝
  5. 100道java面试题
  6. 牛腩新闻发布系统--阶段总结(一)
  7. TCP/IP 详解(第 2 版) 笔记 / 目录
  8. 家居行业内卷?创新乏力?十大关键词解读IF ROOM如何定义未来主义家居
  9. 使用 Unity 3D 开发游戏的架构设计难点
  10. librosa安装技巧