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

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 ,如需转载请自行联系原作者



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

相关文章
Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门
Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门
76 0
Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门
采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)、采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)、在脚本的路径前加上“.”或者 source(了解)原因: 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中。第三种,也就是使用在脚本路径前加“.”或者 source 的方式,`可以使脚本内容在当前 shell 里执行,而无需打开子 shell!`这也是为什么我们每次要修改完
104 0
如何在Bash脚本中引入alias
如何在Bash脚本中引入alias
112 0
基于Bash脚本自己开发ROS的一键启动
基于Bash脚本自己开发ROS的一键启动
110 0
成功解决Git Bash运行脚本命令下载文件到默认C盘路径的问题
成功解决Git Bash运行脚本命令下载文件到默认C盘路径的问题
193 0
bash脚本编程
编程语言: 编译器,解释器 编程语言:机器语言,汇编语言、高级语言 静态语言:编译型语言 强类型(变量) 关键字: 事先转换成可执行格式 c,c++,JAVA,C# 动态语言:解释型语言 on the fly 弱类型 边解释变执行 p...
1000 0
用Vim完成BashShell脚本编写(bash-support : Bash IDE)
作为一名运维工程师,BashShell脚本编写必不可少。然而,大家会发现专门用来编写BashShell脚本的IDE少之又少。
1349 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载