变量
一、shell
1、shell:命令解释器,一种应用程序。
2、shell 多种执行方式:
准备测试脚本:
执行方法 1:bash file1
执行方法 2:sh file1
执行方法 3:. file1
执行方法 4:source file1
3、多种执行方式的区别:
方法 1 和 2 是子shell ;方法 3 和 4 是本shell
(1、2 是计算机新打开一个 shell 去执行;3、4 是在当前的 shell 下执行)
二、变量
变量:用一个固定的字符串去表示不固定的内容,便于修改。
1、自定义变量
变量名和变量值由用户自己定义。
(1) 定义变量:
变量名=变量值 (注意:变量名、= 、变量值之间没有空格)
例:name="bean"
(2) 变量调用:
提取变量中的内容时,需要在变量名前加入 $,通过 echo 命令输出变量的值
变量定义规则:
① 变量名不能以数字开头
② 等号左右两侧不能有空格
③ 变量的值如果用空格,需要用引号包含
④ 不要使用 bash 里的关键字
(3) 重复定义变量:
重复定义的变量会进行叠加覆盖
进行变量叠加时,也可以使用 ${变量名} 的格式:
(4) 变量查询:
可以通过 echo 查了看已经设定的变量的值。
如果不知道变量,可以通过 set 查询计算机所有变量。
set | grep name
(5) 变量删除:
unset 变量名
例:unset aa
(6) 交互式定义变量:
read 从键盘读入变量值
例:编写一个测试 ip 连通性的 bash 脚本
2、整体运算
(1) expr
语法:expr $num1 + $num2 (变量和符号之间要有空格)
+ 加 ; - 减 ; \* 乘 ( \ 转义) ; / 除 ; % 取余
(2) $(())
语法:echo $(($num1+$num2))
(3) $[]
语法:echo $[num1+num2]
(4) let
3、小数运算
需要安装计数器程序 bc
echo "scale=2 ; 6/4" | bc(scale=2:保留两位小数)
4、环境变量
自定义变量只在当前 shell 生效,在子 shell 中无效。若需要 本shell 和 子shell 都能使用,则要声明环境变量。(仅限于当前shell 和 子shell)
未声明环境变量时:
声明环境变量后:
5、位置变量和预定义变量
(1) 位置变量语法:$1、$2 … $9
编写时无定义,使用者需要把参数跟在程序后面(类似占位符)
例:vim ping.sh
(2) 预定义变量
$0:输出脚本名 / 程序名
$* 所有的参数
$# 参数的个数
$$ 程序的 PID
条件测试
1、数值比较 [ 整数 操作符 整数 ]
(1) 操作符:
-gt 大于
-lt 小于
-eq 等于
-ge 大于等于
-le 小于等于
-ne 不等于
(2) 测试语法:
格式1:test 条件表达式
格式2:[ ] 条件表达式
注意:使用 [ ] 条件表达式时前后需要加空格,例如 [ $num -eq 10 ],
因为空格在 shell 中用作分隔符,将命令、参数和操作符分开,如果没有空格会导致解析错误。
● 示例:测试输入的字符串是否符合长度
aaa=12345678 ; test ${#aaa} -ge 7 ; echo $?
#aaa:#+变量名表示输出字符串长度
$?:表示上一个程序的返回值,0 表示成功,非0表示失败
(3) if 语法结构
● 示例:编写脚本检查用户输入的密码,是否满足长度要求
vim pass.sh
2、文件测试 [ 操作符 文件或目录 ]
● 示例:用户输入目录的路径,如果存在提示已存在,不存在提示目录需创建
vim path.sh
test -d $dir1:-d 当 pathname 存在并且是一个目录时返回真
-wpathname:由 pathname 指定的文件或目录存在并且可写时返回真
3、字符串比较 [ "字符串"="字符串" ]
= 等于
!= 不等于
-z:判断字符串长度为0 ; -n:判断字符串长度不为0
使用 -z 或 -n 检查长度时,没有定义的变量长度也为0
● 示例:请求用户确认,yes 表示确认,no 表示放弃
vim select.sh
4、混合条件测试 and / or
当条件测试需要多个条件同时成立时,就用到混合条件测试。
-a (&&):两个条件同时成立,为真;
-o (II):两个条件一个成立,为真
● 示例:测试用户输入的密码是否包含以下条件:
1. 长度大于等于7位
2. 包含字母大写
3. 包含字母小写
5、调试脚本
bash -n + 脚本:调试脚本中的语法错误
bash -vx + 脚本:以调试的方式执行,查询整个执行过程
6、流程控制 if
(1) 单分支结构:
(2) 多分支结构:
(3) 嵌套结构
● 示例:
if id $user &> /dev/null:只进行判断,不输出判断结果
echo $pass | passwd --stdin $user:将存储在 $pass 变量中的密码通过管道传递给 passwd 命令,并用于更改指定 $user 用户的密码。
测试结果:
7、模式匹配 case
(1) 语法:
●示例:检测用户是否确认:
(2) JumpServer 跳板机
通过 shell 编程,编写跳板程序去访问其他服务器