Linux(23) —— shell 运算&执行流控制 ( 条件 循环 )

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 
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值