变量类型:实现确定数据的存储格式和长度。

字符

数值

×××:

浮点型:

布尔型:

真(ture)

假(false)


逻辑运算:

与:&

或:|

非:!


短路逻辑运算:

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

或:只要一个威震,结果一定为真。

非:


引用:

强引用:

在变量使用前,一定要事先声明,甚至还需要初始化。变量在初始化前内容为一段随机数。

数值初始化为0。 字符串初始化为NULL。


弱引用:变量用时声明,不需要区分类型。

bash变量类别:


1.本地变量:

作用域为整个bash进程。仅对当前shell进程有效,对子shell无效。

#[set] [OPTION] VARNAME = VALUE

默认不带参数则显示当前shell中的变量。 

例如:

#NAME=jerry 定义1个变量NANE,赋值jerry

#echo $NAME 输出变量NAME的值。

jerry

#bash 新建zishell

#echo $NAME 输出变量的值,无输出。

局部变量:

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


例如:

#vim a.sh

#!/bin/bash

a=1

test(){

a=${3+4}

}


test()

for I in `seq $a 10`;do

echo $I

done


#bash a.sh

7

8

9

10


#vim a.sh

#!/bin/bash

a=1

test(){

local a=${3+4} 这里a变为局部变量

}


test()

for I in `seq $a 10`;do

echo $I

done


#bash a.sh

1

2

3

4

5

6

7

8

9

10



2.环境变量

是本地变量的一种,作用域为是当前shell进程及其子进程。


脚本在执行时会在当前shell进程中启动一个子进程:

命令行中启动的脚本汇集成当前shell的环境变量。

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


#export [OPTION] VARNAME 把本地变量声明成环境变量。


#export VARNAME=VALUE


#declare -x VARNAME=VALUE


#export VARNAME1:$VARNAME2 将VARNAME1附加到VARNAME2里边。


例如:

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

将/usr/local/apache/bin 添加到环境变量$PATH。


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

#printenv


#env


#exprot



系统常见环境变量:

$HOSTNAME

$SHELL

$HISTORY

$PWD

$OLDPWD

$USER

$MAIL

$PAHT

$PS1 定义提示符前的内容,默认PS1='[\u@\h \W}]\$'

\u 当前用户名

\H 完整的主机名

\h 完整主机名的第一个点前的内容

\W 显示basename,基名。

\w 显示完整路径

\# 显示命令号

\! 显示在命令历史中的序号

\$ UDI=0显示#,普通用户显示$

$PS2 第二个提示符,默认是>号。上个命令未结束。续行符号。

$PS3

$PS4 执行脚本追踪命令的时候显示+号


3.特殊变量

$? 用于引用前一个命令的执行状态的返回值。

$# 参数的个数。

$* 参数列表。

$@ 参数列表。



返回值:

linux中,真的值为0,其他值都为假。

1.程序自身执行结果的返回值。

2.程序执行状态的返回值(0-255)。

0 执行成功

1-255 执行失败,其中1、2、127被系统保留。



例如:

#ls /etc

#echo $?

0

#lss /et

#echo $?

127


#id student

#echo $?

0


#id student $> /dev/null

#echo $?

0



4.位置变量

$1,$2... 用来引用脚本的参数。

shift 参数的轮替。用后一个参数替代前一个参数。

例如:

#./test.sh /etc/fstab /etc/inittab

在test.sh这个脚本中,可以用$1代表/tec/fstab,用$2代表/etc/inittab


写一个脚本:

能接受一个参数:文件路径

判定:此参数如果是一个存在的文件,就显示ok,否则显示no such a file。

test.sh

#!/bin/bash

if [$# -lt 1];then

echo "useage: ./test.sh  ARG1..."

eles

exit 7


if [ -e $1 ]; then

echo "ok"

else

echo "no such a file"

fi


shift.sh:

#!/bin/bash

echo $1

shift

echo $1

shift

echo $1


#bash shift.sh 1 2 3

1

2

3

写一个脚本:

给脚本传递2个参数(整数):

显示两者之和,之积。

#!/bin/bash

if [ $# -lt 2];then

echo "must 2"

exit8

fi

echo "the sum is $[$1+$2]."

echo "the prod is $[$!*$2]"



bash支持的引号

1.'' 单引号

强引用,引号中的内容原封不动输出。

2."" 双引号

弱引用,引号中的变量要进行变量替换。

3.`` 反引号

实现命令替换

$(COMMAND) = `COMMAND`

例如:

#echo "today is `date +%F`"

#echo "today is $(date +%F)"


变量的声明和赋值

声明:

#declare [OPTION] VARNAME 声明一个变量。

-i 声明为×××

-a 声明为数组

-r 声明为只读变量

-x 声明为环境变量

赋值:

#VAR1=VALUE

#VAR2=$VAR1

#VAR1=${VAR2-VALUE} 

#VAR2=${VAR1}VALUE


例如:

#declare -i AGE

#AGE=23

#A=30

#declare -i AGE=23

#declare NAME="tony max"

#NAME= "$AGE" 

#AGE=${A:-40} 若A有值,则AGE的值为A的值,若没有则赋值给40




变量的引用:

只有在引用的时候才带上$。

${VARNAME} 花括号可以省略。


例如:

#ANIMAL=pig

#echo "there are some $ANIMAL"

there are some pig


#echo "there are some ${ANIMAL}s"

there are some pigs 


#echo "there are some $ANIMALs"

there are some


这里不加花括号,系统会认为变量名为ANIMALs。所以无法显示。


#echo 'there are sonme ${ANIMAL}s'

there are sonme ${ANIMAL}s

使用''是强引用,引号中的内容原封不动的输出。


变量的撤销:

#unset [OPTION] VARNAME

例如:

#unset NAME

#echo $NAME


变量赋值:

${PARAMETER:-word}

如果PARAMETER为空或未定义,则变量展开为"word",否则,则展开为PARAMETER的值。

例如:

#A=3

#echo ${A:-30} 若$A不为空,则A的结果为3。否则A的值为30

3

#unset A 撤销变量A

#echo ${A:-30}  $A为空,则把30赋值给A。

30

#echo $A $A的值为空。不会改变变量本身的值。


#echo $A

#A=${A:-30} 若A为空,则把30赋值给A。若A不为空,则把A的值赋值给A。

#echo $A 因为没有设定变量A,所以A的值为30.

30


${PARAMETER:+word}

如果PARAMETER为空或未定义,不做任何操作,否则,则展开为"word"的值。

例如:

#unset A

#echo ${A:+30}

#A=3

#echo ${A:+30}

30


${PARAMETER:=word}

如果PARAMETER为空或未定义,则变量展开为"word",并将展开后的值赋值给PARAMETER。

例如:

#unset A

#echo ${A:=30}

30

#echo $A

30


${PARAMETER:offset:LENGTH}

取子串,从offset处的后一个字符开始,取LENGTH长的子串。LENGTH可省略,则取到最后。

例如:

#A='hello world'

#echo ${A:2:3}

llo

#echo ${A:2}

llo world


软件设备(bit bucket):

/dev/null 数据黑洞,是软件模拟的设备。


/dev/zero 泡泡机,生成大量的0。


/dev/random 随机数生成器,是基于中断的IRQS产生随机数的。IRQS跟一些特殊的硬件绑定,基于这些硬件的interrupts将会提供给random设备。


/dev/urandom 随机数生成器,不受interrupts的限制。



脚本:

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

任何脚本的第一行都得有shebang(魔数):

#!/bin/bash

#为注释

其余内容都被视为脚本的内容。


脚本的执行:

#./BASHNAME.sh

#bash BASHNAME.sh

将当前路径添加到PATH中。


脚本支持配置文件:

例如:

#vim a.sh

#!/bin/bash

. /root/a.conf 加载配置文件

TEST=${TEST:-EMPTY}

[-n "$TEST"] && echo $TEST


#vim a.conf

TEST='hello world'


#bash a.sh

hello world


#vim a.conf

#TEST='hello world'

#bash a.sh

EMPTY