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