Linux入门之bash基础

 

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

 

静态语言:编译型语言

  特点:

变量为强类型

实现转化为一定的可执行格式

  常见:CC++JAVAC#Object-C

 

注意:一般需要解释器的编程语言一般为静态语言

 

动态语言:解释性语言

特点:

变量未弱类型,边解释边执行

常见: PHPSHELLpythonperl

 

lua : 嵌入式脚步语言

 

编程语言的模型、思想分类

面向过程: shell,C

面向对象: java,python,perl,c++

 

一个变量的数据表示:

变量:命名的内存空间

内存:变量地址的存储单元

 

bash支持的引号:

``: 命令替换

"": 弱引用,可以实现变量替换

'': 强引用,不完成变量替换

 

补充:

不同类型的变量占用不同内存空间大小,例如

string 10 占用16bit

int 10 :     占用8bit

 

变量类型:

字符  string

数值  number

×××:  int

浮点型:float

布尔型  (true | false)

 

 

变量类型的作用:用来确定数据的存储格式的长度

 

数据溢出:

1、变量的数值会溢出,数据可能会丢失

2、使用程序判断来解决缓存去溢出 buffer,强类型语言会在编译器编译前事先检查

 

 

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

与:&

举例:如果用1表示true0表示fasle

1:

0:假

1 & 0 =0

0 & 1 =0

0 & 0 =0

1 & 1 =1

 

或:|

true | false

false | true

 

非:!

true = false

! false =true

 

异或

操作数相同为false,不同为true

 

shell: 弱类型语言

 

强弱类型变量区别

强:变量在使用前,必须事先声明,甚至还需要初始化

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

 

变量赋值:

直接使用:VAR_NAME=VALUE

随时用,随时声明,不许类型

 

centos linux默认为bash

 

 

bash变量类型:

环境变量

本地变量(局部变量)

位置变量 $1,$2...

特殊变量

 

本地变量:

    作用域:当前shell进程

NAME=mzf

echo $NAME

在当前bash有效,

输入bash再次打开一个bash

echo $NAME

会发现变量值会空

 

引用变量

  举例:

    ANIMAL=pig      变量定义

    [root@mzf testdir]# echo "There are is $ANIMAL"

There are is pig

[root@mzf testdir]# echo "There are is $ANIMALs"

There are is

这是$VAR_NAME格式就不适用了,需要加{}

[root@mzf testdir]# echo "There are is ${ANIMAL}s"

There are is pigs

[root@mzf testdir]# echo "There are is $(ANIMAL)s"

There are is pigs

 

局部变量

local VARNAME=VALUE 作用域为当前代码段

 

环境变量

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

   定义方法(导出)

   1export VARNAME=VALUE  直接赋值并导出

   2VARNAME=VARLUE        这里的VARNAME为事先声明的

     export VARNAME

 

   举例: 

   输入以下命令

          NAME=mzf

     export NAME        导出

     bash               再次打开子shell

     echo $NAME         仍然输出

 

位置变量

$1,$2,......

 

特殊变量

S?: 上一个命令的执行状态返回值

    0 : true 正确执行

    1~255 : false 错误执行 (:1,2,127为系统预留)

 

补充(在条件判断时时常不想想显示输出信息):

输出重定向:

>     标准输出

>>    追加输出

2>    错误输入

2>>   错误追加输出

&>  总是输出

 

/dev/null 软件设备,数据黑洞 : 用于丢弃输出的数据

 

 

撤销变量

unset VARNAME

 

查看当前shell中变量

查看所有变量,包裹环境变量和本地变量

set

查看当前shell的环境变量

export

env

printenv

 

用途举例:

   ANIMALS=pig

   ANIMALS=$ANIMALS:goat

   暂时新增PATH路径

   PATH=$PATH:/home/tom/helloword

 

比较运算符

 

bash中如何实现条件判断?

条件测试类型:

整数测试

字符测试

文件测试

 

条件测试的表达式:

[ expression ]

` expression `  (注意:这里不适合使用 -a -o,会出错)

test expression


整数比较:

-eq: 测试两个整数是否相等;比如 $A  -eq  $B

-ne: 测试两个整数是否不等;不等,为真;相等,为假;

-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;

-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;

-ge: 大于或等于

-le:小于或等于


命令的间逻辑关系:

逻辑与(短路与)&&

第一个条件为假时,第二条件不用再判断;

第一个条件为真时,第二条件必须得判断;

        条件都成立,结果为真;条件都不成立,结果为假

逻辑或(短路或)||

第一个条件为假时,第二条件继续判断;

第一个条件为真时,第二条件无需判断;

条件有一个成立,结果为真;条件都不成立,结果为假

例子:

如果用户user6不存在,就添加用户user6

! id user6 && useradd user6 || echo "user: user6 is exists."

id user6 && echo "user: user6 is exists."  || useradd user6  

 

 

shell 如何进行算数运算?

 

1let 算数运算符

 let C=$A+$B

2$[算数运算符]

  C=$[$A+$B]

3$((算数运算表达式))

$(($A+$B))

4expr 算数运算符表达式,表达式中各操作及运算符之间要有空格

C=`expr $A + $B`

 

exit : 退出脚步

 

测试方法:

[ expression ]

` expression `

test expression

 

注意: 只有需要整数测试才需要使用 [ expression ] ,比如 [ $INT1 -eq $INT2 ]

例如:

判断用法是否存在

if grep "\<$USERNAME\>" /etc/passwd &> /dev/null; then

判断用法uid是否为0

if [ `grep "\<$USERNAME\>" /etc/passwd | cut -d: -f3` -gt 0 ]

 

文件测试:

-e FILE: 测试文件是否存在

-f FILE:测试文件是否为普通文件

-d FILE: 测试指定路径是否为目录

-r FILE: 测试当前用户指定文件是否有读取权限

-w FILE: 测试当前用户指定文件是否有写权限

-x FILE: 测试当前用户指定文件是否有执行权限

 

组合测试条件:

-a: 于关系

    -o: 或关系

    !:  非关系

例如:

[ -e /etc/inittab ]   注意 :[ -e ] 表示为 true ,没有路径任然为真

[ -x /etc/rc.d/rc.sysinit ]

 

 

 

测试脚步是否有语法错误

bash  -n 脚步名称: 测试语法

bash  -x 脚步:  单步执行 类似 debug

 

注意:一般输入的错误命令选项都会有Unknown(无法识别)这个单词

 

 

exit: 退出脚步

exit #

如果脚步没有明确定义退出状态码,那么最后执行的一条命令的状态码为退出状态码

 

echo $?  查看状态码  

注意:只要脚步最后一天执行成功无论结果,exit默认为0,一般定义为错误退出码来执行非法退出

 

位置变量举例:

./filetest.sh /etc/fstab /etc/inittab

$1 : /etc/fatab

$2 : /etc/inittab

 

环境变量:

  $1,$2,....

  shift      变量s轮替,及第二个替换第一个,后面一个替换前面一个

 

特殊变量:

  $?  状态返回值

  $#  参数的个数

  $*  参数列表

  $@  参数列表

 

字符测试:

== :  测试是否相等,相等为真,不等为假

!= : 测试是否不等,不等为真,相等为假

>: 比较字符的ASCII编码大小,是否大于

<:比较字符的ASCII编码大小,是否小于

-n string : 测试指定字符串是否为空,空则真,不空为假

-z string : 测试指定字符串是否不空,不空为真,空为假

 

 

生成列表:

1、使用{}

{1,..100}  表示 1~100

2、使用seq列表指定列表

seq [起始数 [步进长度]] 结束数

 

declare 声明变量

命令用法:

declare  -i SUM=0      声明为int (整型) 类型

declare  -x  HOST=local         执行声明为环境变量,相等于export

declare  -o  Pai=3.1415926      声明为只读变量,也成常量

 

readonly  VAR_NAME=VALUE            声明为只读变量,也成常量

export  HOST=local                 声明为环境变量

local  AMI=AMI                    声明为本地变量(局部变量)