变量:
命令的内存空间
数据存储方式:
字符
数值
整型
浮点型
布尔型
bash是弱类型语言,把所有要存储的数据统统当做字符进行
不支持浮点数
逻辑运算
true 0
false 非0
短路运算
&&
||
bash中环境变量的种类
本地变量
生效范围为当前shell进程
环境变量
生效范围为当前shell进程以及其子shell进程
局部变量
生效范围为当前shell进程中某代码片段(通常为函数上下文)
位置变量
$1,$2...来表示,用于让脚本在脚本代码调用中通过命令行给它传递参数
特殊变量
$?,$0
本地变量
变量赋值 name="value" 或者 name='value'
value
(1)可以直接是字符串 name="username"
(2)可以是变量引用 name="$username"
(3)命令引用 name=·command· 或者 name=$(command)
变量引用 ${name} 或者 $name
"" 弱引用,其中的变量引用会被替换为变量值
'' 强引用,其中的变量引用不会被替换为变量值
显示所有的变量
set
销毁本地变量
unset name
环境变量
变量声明、赋值
export name=value
declare -x name=value
变量引用
$name ${name}
显示所有的环境变量
export
env
printenv
销毁
unset name
常见环境变量 PATH SHELL UID HOME
变量命名法则
1、不能使用程序中的保留字,例如if,for
2、只能使用数字,字母及下划线,且不能以数字开头
3、见名知义,驼峰命名法
只读变量 不能被修改,也不能unset被销毁
readonly name
declare -r name
位置变量
$1,$2...对应调用第一,第二个参数
$0 命令本身
$* 传递给脚本的所有参数(所有参数当做一个字符串)
$@ 传递给脚本的所有参数(所有参数当做独立字符串)
$# 传递给脚本的参数的个数
换岗操作
shift 剔除1个位置变量
shift 数字 剔除数字个位置变量
bash的配置文件
按照生效范围划分,存在两类:
全局配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置
~/.bash_profile
~/.bashrc
按照功能划分,存在两类
profile类:为交互式登录的shell提供配置
功用:
(1)用于定义环境变量
(2)用于运行命令和脚本
例如 编辑文件 vi /etc/profile.d/welcome.sh
内容如下:
echo "欢迎光临本系统 ${UID},您的家目录是${HOME}"
当用户登录系统时,会提示欢迎信息
bashrc类:为非交互式登录的shell提供配置
功用:
(1)用于定义命令别名
(2)用于定义本地变量
但是两者并没有严格进行区分,可能有交叉
shell登录:
交互式登录:
直接通过终端输入账号密码登录
使用 su - username 或者 su -l username切换的用户
/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc
非交互式登录:
su username
图形界面打开的终端
执行脚本
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
定义让所有用户都生效的别名
/etc/bashrc
设置环境变量
临时配置
export PATH="$PATH:新增的环境变量"
或者 declare -x PATH="$PATH:新增的环境变量"
永久配置
/etc/profile.d/XXX.sh 或者 ~/.bash_profile
PATH=$PATH:新增的环境变量
export PATH
或者 export PATH=$PATH:新增的环境变量
生效方式
(1)重启或者新开终端
(2)使用source或者.
副作用:变量可能出现重复
bash中的算数运算 help let可以帮助查看算数表达式
+,-,*,/,%,**……
(1) let var=算数表达式
num1=3
num2=4
let num3=$num1+$num4
echo $num3
(2)var=$[算数表达式]
num4=$[num1+num2]
echo num4
或者 echo $[num1+num3]
(3)var=$((算数表达式))
echo $((2**3))
(4)var=$(expr 参数1 参数2(运算符) 参数3 ……)
特殊字符需要转义
随机数生成器
$RANDOM 0-32767
我们可以man bash后搜索RANDOM查看
增强型赋值
+= -= *= /= %=
count=$[$count+1]
let count+=1
自增 自减
++ --
let count++
条件测试:
判断某需求是否满足,需要有测试机制来实心
专用的测试表达式需要由测试命令来执行
test 表达式
[ 表达式 ]
[[ 表达式 ]]
注意:[] 和 表达式之间需要有空格
test 1 -gt 3
echo $?
[ 1 -lt 3 ]
echo $?
测试类型:
数值测试
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
字符串测试
== 等于
> 大于
< 小于
!= 不等于
=~ 左侧的字符串是否能够被右侧的模式所匹配
一般需要使用 [[ 表达式 ]]来使用
例如 [[ abc =~ ^a.* ]]
echo $?
-z "字符串" 测试字符串是否为空,空则为真,不空为假
-n "字符串" 测试字符串是否不空,不空为真,空则为假
文件测试
存在性测试
-a 文件
-e 文件 文件存在性测试,存在为真,否则为假
存在性及类别测试
-b 文件 存在且为块设备文件
-c 文件 存在且为字符设备文件
-d 文件 存在且为目录文件
-f 文件 存在且为普通文件
-h 文件 存在且为符号链接文件
-p 文件 存在且为命令管道文件
-S 文件 存在且为套接字文件
文件权限测试
-r 文件 存在且可读
-w 文件 存在且可写
-x 文件 存在且可执行
文件特殊权限测试
-g 文件 存在且拥有sgid权限
-u 文件 存在且拥有suid权限
-k 文件 存在且拥有sticky权限
文件大小测试
-s 文件 存在且非空
文件是否打开
-d fd fd表示文件描述符是否打开且与某终端是否相关
-N 文件 文件自从上一次被读取后是否被修改过
-O 文件 当前有效用户是否为文件属主
-G 文件 当前有效用户是否为文件属组
双目测试
文件1 -ef 文件2 是否指向同一个设备上的相同inode
文件1 -nt 文件2 文件1是否新于文件2
文件1 -ot 文件2 文件1是否旧与文件2
典型用法
[[ -d dir1 ]] || mkdir dir1 如果不存在目录就创建
组合测试条件
逻辑运算
第一种方式:
&& 与
|| 或
! 非
[ -e 文件 ] && [ -r 文件 ] 文件存在且可读
第二种方式
-a 与
-o 或
[ -e test.sh -a -x test.sh ] 文件存在且可执行
bash自定义退出状态码
exit [n]
注意:脚本中一旦遇到exit命令,会立即终止,退出状态取决于exit后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码