1、什么是shell变量?本地变量、环境变量、变量替换(显示变量)、位置变量、标准变量、特殊变量、影响变量的命令

2、本地变量:本地变量在用户现在的shell生命期的脚本中使用

   variable-name=value

   set显示本地所有的变量

   readonly variable-name

   例子:

   LOCALTEST="test"

   echo ${LOCALTEST}

   readonly LOCALTEST

   设置了readonly之后不能对变量进行改变,要谨慎使用

   readonly命令,查看当前制度的变量

3、环境变量用于所有用户进程(经常称为子进程)。登陆进程称为父进程。shell中执行的用户进程称为子进程。不像本地变量(只用于现在的shell)环境变量可用于所有子进程,这包括编辑器、脚本和应用。

$HOME/.bash_profile(/etc/profile)

export(设置环境变量)

env(查看环境变量)

4、变量替换:用变量的值替换它的名字。echo

在变量名前加$,使用echo命令可以显示单个变量取值

例:testvar="this is a test"

echo ${testvar}

${Variable name}            显示实际值到variable name

${Variable name:+value}     如果设置了variable name,则显示其值value,否则,为空

${Variable name:?value}     如果未设置variable name,显示用户定义错误信息value

${Variable name:-value}     如果未设置variable name,则显示其值value

   ${Variable name:=value}     如果未设置variable name,设置其职,并显示

   unset:unset variable-name(变量清除)

5、位置变量

   位置变量表示$0,$1......$9(共10个,超出10个用其他方法)

   向脚本中使用位置参数(find / -name $1 print)

   向系统命令传递参数

6、标准变量

   bash默认建立了一些标准环境变量,可在/etc/profile中定义(EXINIT(定义vi)、HOME(定义主目录)、IFS(定义linux字符之间用什么分割,理论上可以修改为任意字符)、LOGNAME、、MAIL(当前用户的存储邮箱)、MAILCHECK(每隔多少秒检查是否有邮件)、MAILPATH(有多个邮箱的地址,用:分隔)、TERM(终端类型)、PATH(可执行文件的寻找目录,用:分割)、TZ(时区)、PS1(登陆后,输入命令前端文字的设置)、PS2、PWD(当前目录)、SHELL(当前运行的是那个shell)、MANPATH(帮助手册存放)、TERMINFO(终端类型的配置信息))

7、特殊变量

   $#(传递到脚本的参数个数)

   $*(以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个)

   $$(脚本运行的当前进程ID号)

   $!(后台运行的最后一个进程的进程ID号)

   $@(与$#相同,但是使用时加引号,并在引号中返回每个参数)

   $-(显示shell使用的当前选项,与set命令功能相同)

   $?(显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

8、影响变量的命令

   declare 设置或显示变量

   -f    只显示函数名

   -r    创建只读变量(declare和typeset)

   -x    创建转出变量

   -i    创建整数变量

   使用+替代-,可以颠倒选项的含义

   export 用于创建传给子shell的变量

   -- 表明选项结束,所有后续参数都是实参

   -f 表明在"名-值"对中的名字是函数名

   -n 把全局变量转换成局部变量。换句话说,命令的变量不再传给shell

   -p 显示全局变量列表

   readonly 用于显示或设置只读变量

   -- 表明选项结束

   -f 创建只读变量

   set 设置或重设各种shell

   shift [n] 用于移动位置变量,调整位置变量,使$3的值赋予$2,$2的值赋予$1

   typeset 用于显示或设置变量

           是declare的同义词

   unset 用于取消变量的定义

   -- 表明选项结束

   -f 删除只读变量,但不能取消从shell环境中删除指定的变量和函数。如PATH,PS1,PS2,PPID,UID,EUID等的设置。

9、引用的必要性

   变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是引用错误

   使用双引号可引用除字符$、`、\外的任意字符或字符串

10、单引号

   单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符串

11、反引号

   反引号用于设置系统命令的输出到变量,shell将反引号中的内容作为一个系统命令,并执行其内容。

12、反斜杠

   如果一个字符有特殊含义,反斜杠防止shell误解其含义,即屏蔽其特殊含义

   下述字符包含有特殊意义:&  *  +  ^  $  `  "  |  ?

13、运算符

   运算符是对计算机发的指令

   运算对象:数字、字符(字面值)、变量、表达式

   表达式:运算符和运算对象的组合体

14、按位运算符

   ~  <<  >>  &  |  ^

   $[ ]表示形式告诉shell对方括号中的表达式求值

   位运算符                                说明

   ~op1        反运算符,把op1中所有的二进制为1的变为0,0变为1

   op1<<op2    左移运算符,把op1中的二进制位向左移动op2位,忽略最左端移出的各位,最右端                    的各位补上0值,每做一次按位左移就有实现op1乘以2

   op1>>op2    右移运算符,把op1中的二进制向右移动op2位,忽略最右端移出的各位,最左端的                    各位补上0值,每做一次按位左移就有实现op1除以2

   op1&op2     与比较运算符,op1和op2对应位,对于每个二进制位来说,如果两者该位都是1,则                    结果为1,否则结果为0

   op1~op2     异或运算符,比较op1和op2的对应位,对于每个二进制位来说,如果两者该位互                    补,则结果为1,否则,结果为0

   op1|op2     或运算符,比较op1和op2的对应位,对于每个二进制位来说,如果两者该位有一个                    是1或者都是1,则结果位为1,否则,结果位为0

15、逻辑运算符 (&&  ||  ==  !=)

16、赋值运算符(=、+=、-=、*=、/=、%=、^=、|=、<<=、>>=)

   let $count = $count + $change

   let $count + = $change

17、表达式替换

   $[]和$(( )):习惯使用$[ ],所有shell的求值都是用整数完成

   $[ ]可以接受不同基数的数字:[base#n]n表示基数从2到36的任何基数

   例:echo $[10#8+1]表示8进制的10加1