bash的基础特性(5)
变量类型:
数据存储格式、存储空间大小、参与运算种类:
字符型
数值型:
整形
浮点型
强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用为生命的变量会产生错误
弱类型:无需指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无需事先定义可直接调用
bash
bash中的变量的种类:
根据变量生效范围等标准:
pstree:显示当前系统进程数
bash:进入子进程
本地变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,
包括当前shell的子shell的进程都无效果
环境变量:生效范围为当前shell进程以及子进程;
局部变量:生效范围为当前shell进程中某代码片段(通常指函数);
位置变量:$1,$2...来表示,用于让脚本代码中调用通过命令行给它的参数
特殊变量:$?,$0,$*,$@,$#
本地变量:
变量赋值: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
bash有许多内建的环境变量:
PATH,SHELL,UDI,HISTSIZE,HOME,PWD,OLD,HISFILE,PS1
变量命名法则:
1、不能使用程序中的表刘子:例如if,for
2、只能使用数字、字母、下划线,不能数字开头
3、见名知义
只读变量:不可被修改删除
readonly name
declare -r name
位置变量:
在脚本代码中调用通过命令行传递给脚本的参数:
$0:命令本身
$1,$2对应第一个、第二个参数;
换岗轮替操作:
shift 【n】
$*:传递给脚本所有参数
$@:传递给脚本所有参数
$#:传递脚本的数量
bash的配置文件:
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh结尾的文件
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,存在两类:
profile类:为交互式登录的shell提供配置
全局配置:/etc/profile /etc/profile.d/*.sh结尾的文件
个人配置:~/.bash_profile ~/.bashrc
bashrc类:为非交互式登录的shell提供配置
shell登录:
交互式登录:
直接通过终端输入账号密码登录:
使用su - username登录
非交互式登录:
su username
图形界面下打开的终端
执行脚本
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
编辑配置文件定义的新配置的生效方式:
(1) 重新启动shell进程;
(2) 使用source或.命令进程;
问题:
1、定义对所用用户都生效的别名?
2、让用户的PATH环境变量的值多出一个路径,
bash中的算数运算
+ - * / % **
实现算数运算:
1、let var = 算数表达式
2、var = $[算数表达式]
3、var = $((算数表达式))
4、var = $(expr arg1 arg2 arg3...)
乘法符号有些场景中需要转义
bash有内建的随机数生成器:$RANDOM
增强型赋值:
+= -= *= /= %=
自增、自减
let var +=1
let var++
let var -=1
let var--
练习1、写一个脚本
计算/etc/passwd文件中的第10个用户和第20个用户的ID之和:
#!/bin/bash
userid1=$(head -n 10 /etc/passwd |tail -n 1|cut -d: -f3)
userid2=$(head -n 20 /etc/passwd |tail -n 1|cut -d: -f3)
useridsum=$[$userid1+$userid2]
echo "uid sum: $useridsum"
练习2、写一个脚本
传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
#!/bin/bash
spaceline1=$(grep "^[[:space:]]*$" $1 | wc -l)
spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l)
echo "The sum of space line: $[$spaceline1+$spaceline2]"
练习三、统计/etc,/var,/usr目录公有多少个一级子目录和文件
条件测试:
判断某需求是否满足,需要由测试机制来实现:
Note:专用的测试表达式需要由命令辅助完成测试过程:
测试命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
Note:EXPRESSION两边必须由空白字符;
bash的测试类型:
数值测试
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
字符串测试
==:等于
>:大于
<:小于
!=:不等于
=~:左侧字符串是否能够被右侧PATTERN所匹配
Note:一般用[[ ]]
-z "STRING":测试字符串是否为空,空真不空假
-n "STRING": 测字符串是否不空,不空真,空假
Note:测字符串比较时,用到的操作数都应该使用引号
文件测试
bash自定义退出状态码:
exit [n]:自定义退出状态码;
注意:脚本中一旦遇到exit命令,脚本会立即终止:终止退出状态取决于exit命令后的数字
如果未指定退出状态码,整个脚本的退出状态码取决于最后一条命令的退出状态码