开发者社区> 技术小甜> 正文

bash脚本编程之一变量、变量类型等

简介:
+关注继续查看

grep:支持基本正则表达式,使用?、{}、()等元字符必须使用\转义

egrep:支持扩展正则表达式,多支持+、|等元字符,且无需转义

fgrep:fast grep,不支持正则表达式,效率最高,消耗资源最少。


shell的编程特性:脚本编程

先看看编程语言的分类:

    按语言等级层次分:

          机器语言-->汇编语言-->高级语言

    按语言特性分类:

            编译型(静态)语言:执行前必须先编译成可执行格式,执行时无需其他条件

                                 强类型(变量):变量在使用前必须先声明,甚至还需初始化

                                c、c++、c#、java ...

            解释型(动态)语言:边解释边执行,要想执行,系统中必须包含对应的解释器

                                 弱类型:变量用时声明,甚至不区分类型

                                php、python、perl、shell ...

    按工作特性分类:

        面向过程语言:c、shell、perl

        面向对象语言:java、python、c++、perl


变量:一段公用的内存空间

内存:编址的存储单元

进程:执行中的程序

变量类型:事先确定数据的存储格式和长度

    字符型:

    数值:

        整形

        浮点型:11.23  1.123*10^1  0.123*10^2

    时间:

    2015.12.30:64bit

    99999:24bit


linux默认把数据存储为字符格式,以下命令不会得到想要的结果

[root@logstach tmp]# echo  2+3

2+3

可以这样:(注意2+3之间要空格)

[root@logstach tmp]# expr 2 + 3

5


问题:为什么要定义变量类型?

    假设我们存储10这个代码,如果我们把它存储成字符类型,那么理论上7个二进制位可以完全表示ascll码,存储10则需要14位,但是由于计算机最小单位是字节,所以最终占用16位。而如果存储为数字格式的话,10转化为二进制为1010,也就是只要4位最终占用1个字节就可以了。如果不加以区分,会早造成大量的空间浪费。  


缓冲区溢出攻击:

    假设我们定义一个变量的存储长度为8bit,当存储数值为256时,此时数值超过了8bit能表示的数值,于是向前进1,这个1就是溢出的位,如果溢出的位影响到的地址空间恰好是某个关键性进程的内存空间,所造成的后果是难以想象的。


逻辑运算:与、或、非、异或


变量赋值:VAL_NAME=VALUE


bash变量:

    本地变量:VALNAME=VALUE 作用域为整个bash进程

    局部变量:local VALNAME=VALUE  作用域为当前代码段

    环境变量:export VALNAME=VALUE 或VALNAME=VALUE ; export VALNAME

              作用域为当前shell进程以及子进程

    特殊变量:$?上一个命令的执行状态返回值

    位置变量:$1、$2、....    


脚本在执行时会启动一个子shell进程

    命令行中启动的脚本会继承当前shell的环境变量

    非命令行(系统自动执行的脚本)需要自我定义各环境变量;


程序执行时,可能有两类返回值:

    程序执行结果

    程序状态返回代码(0-255)

        0:正确执行

        1-255:错误执行,1,2,127系统预留


/dev/null:软件设备,bit bucket,数据黑洞,任何输出指向给它都不再屏幕上显示也不存储

        

引用变量:${VALNAME} {}有时可以省略

不可以省略的情况:

[root@logstach ~]# name=you

[root@logstach ~]# echo "i am $namer lover"

i am  lover

[root@logstach ~]# echo "i am ${name}r lover"

i am your lover


撤销变量:

unset  VARNAME


查看当前shell中变量:

set

查看当前shell中的环境变量:

printenv

env

export


脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序


shebang:魔数

#!/bin/bash

    linux只认为elf是可执行格式,魔数的作用就是告诉内核用什么解释器来解释执行这些ascll代码,如果perl脚本就用#!/bin/perl,python脚本就用#!/bin/python


练习:写一个脚本,完成以下任务

1,添加5个用户,user1...user5

2.每个用户密码通用户名,而且要求添加密码不显示passwd返回的执行结果信息。

3.每个用户添加完成后,显示xxx添加成功字样。


练习:写一个脚本,完成以下任务

  1. 使用一个变量保存一个用户名

  2. 删除此变量中的用户,并删除其家目录

  3. 显示用户删除完成信息。












本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1730424 ,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Bash特殊变量:$0, $#, $*, $@, $?, $$实战
在linux下配置shell参数说明 前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运行结果 29949 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。
1098 0
VB编程:Timer控件中使用计数变量
VB编程:Timer控件中使用计数变量
25 0
12.Linux shell编程(脚本传参)
(创建于2018/1/31) 1.传递参数 Press ENTER or type command to continue #!/bin/bash ...
879 0
【Shell脚本】awk中如何使用shell的环境变量
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 一:"'$var'" 这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如: var="test"awk 'BEGIN{print "'$var'"}' 这种写法其实际是双括号变为单括号的常量,传递给了awk.
477 0
+关注
10145
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载