Linux(23) —— shell 脚本
这几章笔记是针对redhat8系统中bash的操作指令做记录。
1. shell 中的运算
在shell中也支持与其他编程语言相同的绝大多数运算。
- 运算符号
符号 | 含义 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
** | 乘方 |
++ | 自加一 |
– | 自减一 |
< | 小于 |
<= | 小于等与 |
> | 大于 |
>= | 大于等与 |
>= | 等于 |
+= | 加等,加上等号后面的数 |
*= | 乘等,乘以等号后面的数 |
/= | 除等,除以等号后面的数 |
%= | 取余等,mod等号后的数 |
-
运算指令
(()) #双重小括号 ((a=1+2)) let # let a=1+2 expr # expr 1 + 2 bc #计算器 bc << EOF 1+2 EOF [] # echo $[1+2] 与(()) 近似等价
注:
expr需要使用空格隔开每个项,使用乘法等操作时需要用 \ 屏蔽运算符的特殊含义。且expr只能进行运算无法进行赋值。
作为云算指令直接使用[ ]时相当于test命令,内容容前后必须有空格。而使用echo或其他指令直接输出运算值是无需添加空格
括号、let:
expr:
bc、中括号:
-
浮点运算
在bash中并不支持浮点运算,如需进行浮点运算需要借助awk bc等工具实现。c=$(echo "5.01-4*2.0"|bc) c=$(awk 'BEGIN{print 7.01*5-4.01 }')
-
格式化输出
在shell中也支持printf格式化输出命令。
3. shell 中的循环结构
在shell中支持 for while until 等循环结构。
-
for
for 定义变量,与循环开始动作 ;do 使⽤变量,执⾏动作;done 结束标志。for A in $(seq 1 10) #seq 用于输出指定序列1-10 do echo $A done ####################################### for A in {1..10} # {} 列举指定序列 do echo $A done ####################################### for A in A B C D # 在in后直接加字符串,会遍历所有字符串 do echo $A done ####################################### for ((A=0;A<10;A++)) # for 后接小括号内包含执行语句,执行逻辑与其余语言相同 do echo $A done
-
while
while true #条件为真时 do #执行下列动作 echo hello echo linux done #动作结束 ####################################### while [ A != 10 ] #条件为真时 do #执行下列动作 let A++ echo hello echo linux done #动作结束
-
until
until false #条件为假时 do #执行下列动作 echo hello echo linux done #动作结束 ####################################### until [ A = 10 ] #条件为假时 do #执行下列动作 let A++ echo hello echo linux done #动作结束
4. shell 中的条件结构
-
if
if [ 条件1 ] then 动作1 elif [ 条件2 ] then 动作2 else 动作3 fi # 判断结束
-
case
case $A in #选择变量 word1|WORD1) #第一个匹配分支 action1 ;; word2|WORD2) #第二个匹配分支 action2 ;; *) #默认、通配动作 action3 esac
-
跳转动作
contiue (num) # 默认终止本层此次循环提前进⼊本层下个循环 # num不为1时,表示外num层循环 break (num) # 默认跳出本层循环 # num不为1时,表示外num层循环 exit (num) # 脚本退出,并返回值 0-255 # 默认使用$?调用最新的脚本或者语句返回值,0为成功执行 其余为失败 return (num) # 结束子函数,并返回值 0-255 # 无num时默认返回return上最后一条执行的命令的返回状态,有值时返回值
5. shell 中的自动应答 expect
expect用于自动化交互,需要安装expect。
[root@rhel]#dnf install expect -y
expect 传参时 需要使用set 设定expect内部变量数据,输入参数以 [ lindex $argv < num > ]储存。
-
单独使用expect
#!/usr/bin/expect set timeout 10 #超时时间 set username [lindex $argv 0] #设定传入参数第一个为username set password [lindex $argv 1] # set hostname [lindex $argv 2] # spawn ssh-copy-id -i .ssh/id_rsa.pub $username@$hostname #监控命令 expect "yes/no" {send "yes\r"} expect "password:" {send "$password\r"} expect eof #结束expect环境 interact表示继续停留在expect环境
[root@rhel]# ./ssh.exp root password hostname1 #脚本实现无密码登录
-
在shell脚本中使用expect
#!/bin/bash ip=$1 user=$2 password=$3 expect <<EOF set timeout 10 spawn ssh $user@$ip #监控命令 #expect块中语句优先级相同 #expect块与其余expect语句顺序执行 expect { "yes/no" { send "yes\r";exp_continue } "password" { send "$password\r" } } expect "]#" { send "useradd test\r" } expect "]#" { send "echo westos | passwd --stdin test\r" } expect "]#" { send "exit\r" } expect eof EOF