天天看点

菜鸟学Linux 第014篇笔记 bash脚本(变量,变量类型)

菜鸟学Linux 第014篇笔记 bash脚本(变量,变量类型)

上一节忘记讲了,sorry 还有一个命令fgrep

此命令是fast grep=grep -F 快速搜索文本,该命令不可以使用正则表达式,

如果有包含正则表达式的字符,直接当字符去匹配。

Shell编程

编程语言:机器语言、汇编语言、高级语言

高级语言:

静态语言:编译型语言

强类型(变量) 强:变量在使用前,必须事先声名,甚至还需要初始华; 强:变量在使用前,必须事先声名,甚至还需要初始华;

关键字:

执行时要事先转换成可执行格式,而动态语言的解释器则是由静态语言所编写而成

属于静态语言的: C、 C++、 JAVA、 C#、 ...

动态语言:解释型语言

通常弱类型 弱:变量不需要声名(不区分类型)

执行时边解释边执行

属于动态语言: ASP、 ASP.net、 PHP、 SHELL、 python、 perl ...

编程模型

面向过程 shell、 C

就是把编程的着眼点、立足点主要在于问题解决过程本身。(适合开发小型程序)

Linux 内核是使用面向过程的C语言研发的

面向对象 JAVA(纯面向对象), Python, perl(两者都有), C++

把整个我们要实现的项目、抽象成一个个对象、并且定义对象之间的动作

(可发出的操作)来完成。这样的风格适合开发大型应用程序。

变量:内存空间,命名

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

字符型

数值型

整  型:11

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

时间型

布尔型true 1 false 0

内存:编址的存储单元

进程:

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

1:真

0:假

与运算:&& and 

1&&0=0

0&&1=0

0&&0=0

1&&1=1

或运算:or

1||0=1

0||1=1

0||0=0

1||1=1

非运算:not

!true = false

! false =true

异或:

1 0=1

0 1=1

0 0=0

1 1=0

短路运算

与:只要有一个为假,结果一定为假;

或:只要有一个为真,结果一定为真;

        变量赋值: VAR_NAME=value

bash变量类型:

环境变量

本地变量(局部变量)

位置变量

特殊变量

本地变量:

作用域:整个bash进程

VARNAME=VALUE

局部变量:

作用域:当前代码段

local VARNAME=value

环境变量:

作用域:当前shell进程及其子进程(如果重新登录一个shell则无效)

export VARNAME=value; 

也可以先定义VAR_NAME=value then export VAR_NAME

位置变量:

$1, $2, ...      表示引用某个变量

特殊变量:

$?: 上一个的执行状态返回值

程序执行时,可能有两类返回值:(0-255)

程序执行结果

程序状态返回代码

0 正确执行

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

使用输出重定向技巧

>

>>

2>

2>>

&>

/dev/null: 软件设备 bit bucket 数据黑洞

id student &> /dev/null

撤消变量:

unset VAL_NAME

查看当前shell中变量:set (包含环境变量和本地变量)

查看当前shell环境变量: printenv (print environment) env export

追加变量:

ANIMALS=pig

ANIMALS=$ANIMALS:pig ANIMALS=pig$ANIMALS

export PATH=$PATH:/usr/local/apache/bin

PATH=/usr/local/mysql/bin:$PATH

shell变量默认是字符串,不可以做算术运算

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

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

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

bash: 变量是进程的变量,如果进程结束,则变量清除;

且父shell声名变量,子shell无法调用,反之亦然;

引用变量: ${VAR_NAME} 括号有时可省略

查看变量 echo $VAR_NAME

'' 单引号不执行变量替换

"" 双引号可执行变量替换

写脚本

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

shebang:魔数 #!/bin/bash

含义:因为linux内核只能识别elf可执行文件,而脚本是一个文本文档

如果想要其执行,必须使用解释器,而上边#!/bin/bash则表示文件要执行,

用bash解释器来解释文本里包含的执行命令

#表示注释行,不执行

练习:

练习写脚本,使其完成以下任务

脚本1

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

2、每个用户的密码同用户名,而且要求,添加密码完成后不显示命令的执行结果信息

3、每个用户添加完成后,都要显示“用户某某添加成功信息”

脚本2

1、使用一个变量保存一个用户名;

2、删除此变量中的用户且一并删除其家目录;

3、显示用户“删除完成”类的信息;

key:

script 1:(初学编写,有待优化,见谅)

#!/bin/bash

S=student

T1=${S}1

T2=${S}2

T3=${S}3

useradd -M $T1

echo $T1 | passwd --stdin $T1 &> /dev/null

echo $?

echo "User $T1 have added"

我只添加的一段,其它用户的类似

script 2:

rm -f /var/mail/$T1

userdel $T1

echo "User $T1 have deleted"

初次编写脚本错误经验

1、变量起名时不用加$

2、引用变量时后边有其它文本时用${VAL_NAME}而不是{$name}

本文转自Winthcloud博客51CTO博客,原文链接http://blog.51cto.com/winthcloud/1861891如需转载请自行联系原作者

Winthcloud