Shell学习-变量、数组、比较运算符、test命令

变量

类型

根据作用域及生命周期可以分为四类:本地变量、环境变量、全局变量、内置变量

本地变量(临时变量):用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失效(当前进程中有效,其他进程及当前进程的子进程无效)。
环境变量:定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用(能够被子进程调用)
全局变量:所有用户及shell都可以使用,可以在/etc/profile /etc/bashrc下永久定义
内置变量:系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.
env #查看当前用户的环境变量
set #查询当前用户的所有变量(临时变量与环境变量)

将临时变量转换为环境变量的两种方法
  1. export
export  TMP=“wzbwzt”   #临时将临时变量转换为环境变量
  1. 在家目录下的.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 + 命令:查看命令的详情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值