变量
类型
根据作用域及生命周期可以分为四类:本地变量、环境变量、全局变量、内置变量
本地变量(临时变量):用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失效(当前进程中有效,其他进程及当前进程的子进程无效)。
环境变量:定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用(能够被子进程调用)
全局变量:所有用户及shell都可以使用,可以在/etc/profile /etc/bashrc下永久定义
内置变量:系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.
env #查看当前用户的环境变量
set #查询当前用户的所有变量(临时变量与环境变量)
将临时变量转换为环境变量的两种方法
- export
export TMP=“wzbwzt” #临时将临时变量转换为环境变量
- 在家目录下的.bashrc或.bash_profile文件中添加变量(永久生效)
#修改完配置文件后,使用source 进行重新加载生效
source ~/.bashrc
#注意:同样可以通过修改/etc/profile 或者/etc/bashrc 来永久生效全局变量
内置变量的介绍
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录
$$:当前所在进程的进程号 echo $$ eg:kill -9 `echo $$` = exit 退出当前会话
$!:后台运行的最后一个进程号 (当前终端)
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出
$_:最后一个命令的执行结果
$0:当前执行的进程/程序名
$N: 脚本后面的对应位置的参数信息;以空格来区别不同位置的参数
${10}~${n} 扩展位置参数变量 第10个位置变量必须用{}大括号括起来
定义
变量格式: 变量名=值
在shell编程中的变量名和等号之间不能有空格。
变量名命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
字符串要用单引号或双引号引起来
取消(unset)
unset 变量名 #取消该变量;如果是写在变量文件中的话重启终端会恢复,后者source后也会恢复
取值
$变量名 #拿到变量名指向的地址中保存的值
url=www.baidu.com
echo ${#url} #获取变量的长度
echo ${url#*.} # 以分隔符.界限 *匹配所有 >baidu.com
echo ${url##*.} >com
echo ${url%.*} >www.baidu
echo ${url%%.*} >www
数组
普通数组:只能使用整数作为数组索引 (declare -a 查看当前用户环境的所有普通数组)
关联数组:可以使用字符串作为数组索引(k-v) (declare -A 查看当前用户环境的所有关联数组、declare -A 变量名:声明一个关联数组)
赋值
普通数组
#单个赋值
array[0]=value1
array[1]=value2
array[3]=value3
#多个赋值
array=(var1 var2 var3 var4)
#扩展使用
array1=(`cat /etc/passwd`) #将文件中每一行赋值给array1数组
array2=(`ls /root`)
array3=(harry amy jack "Miss zhang") #>>array3='([0]="harry" [1]="amy" [2]="jack" [3]="Miss zhang")'(数组中每个string元素建议用""or''包裹起来,看起来比较清晰)
array4=(1 2 3 4 "hello world" [10]=linux) #>>array4='([0]="1" [1]="2" [2]="3" [3]="4" [4]="hello world" [10]="linux")'
关联数组
#使用前需要先声明为关联数组
declare -A relationArray
#单个赋值
relationArray[GO]=top1
relationArray[Python]=top2
relationArray[Shell]=top3
#多个赋值
relationArray=([GO]="top1" [Python]="top2" [Shell]=top3)
取值
取值方式: ${数组名称[索引]} (普通数组和关联数组通用)
echo ${array1[2]} #>> var3
echo ${array1[*]} 获取数组里的所有元素 (*和@都指所有元素)
echo ${#array1[*]} 获取数组里所有元素个数
echo ${!array1[@]} 获取数组元素的索引索引
echo ${array1[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
比较运算符
整数比较
-eq 等于 equal
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于
test 100 -gt 300;echo $? #>>1
### test只能比较两个整数的关系,不会返回结果,需要通过$?才能看到结果
如何比较浮点数
test `echo "1.6*10"|bc|cut -d "." -f1` -ge 20;echo $? # >>1; 将浮点数放大再去掉小数点进行比较
字符串的比较
== 等于
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0
name=
test -n "$name";echo $? #>1
test -z "$name";echo $? #>0
逻辑运算符
逻辑与运算 &&
逻辑或运算 ||
逻辑非运算 !
test命令
检测文件类型和比较运算
(比较运算只能比较两个整数的运算;且不会返回运算结果,只能通过$?来看到结果)
-d 检查文件是否存在且为目录
-e 检查文件是否存在(不管是文件还是目录)
-f 检查文件是否存在且为文件
-r 检查文件是否存在且可读
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在并且被当前用户拥有
-G 检查文件是否存在并且默认组为当前用户组
-nt file1 -nt file2 检查file1是否比file2新
-ot file1 -ot file2 检查file1是否比file2旧
-ef file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点
### man + 命令:查看命令的详情