shell脚本——循环语句、sed、函数、数组、免交互expect

这篇具有很好参考价值的文章主要介绍了shell脚本——循环语句、sed、函数、数组、免交互expect。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

循环语句

for

while 与 until

sed

基本用法

sed脚本格式

函数

注意事项

定义函数和调用函数

脚本中函数的位置

查看函数

删除函数

函数返回值

函数的传参操作

使用函数文件

递归函数 

数组

声明数组

数组切片

免交互expect

定义

 基本命令


循环语句

for

for循环需要知道循环的次数

格式1:

for  变量   in   变量范围

do
执行的命令
done

例如:计算1到100的和

#!/bin/bash
sum=0                # 定义和的变量
for i in {1..100}        # 遍历1到100
do
sum=$[sum+i]        # 计算1到100的和
done
echo $sum               # 输出总和

 shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 格式2: 

for (( 表达式1; 表达式2; 表达式3 )); do 命令; done

for (( 表达式1; 表达式2; 表达式3 ))

do 命令

done

 例如:计算1到100的和

#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
sum=$[sum+i]
done
echo $sum

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

for循环嵌套

例如:打印99乘法表

#!/bin/bash
for i in {1..9}
do
for ((j=1;j<=$i;j++))
do
echo -en  "$i*$j=$[i*j]\t"
done
echo
done

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 for循环例子:

例1:批量添加用户

#!/bin/bash
ulist=$(cat /opt/user.txt)
for uname in $ulist
do
   useradd $uname
   echo "123123" |passwd --stdin  $uname &>/dev/null
done

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 例2:批量修改后缀名

#!/bin/bash
cd /data
for file in *
do
name=`echo $file |cut -d "." -f1`
mv $file   ${name}.bak
done

 shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

while 与 until

相对于for循环,while循环不需要知道循环次数,但是需要给循环结束的条件,否则就是死循环。

while与until的区别:

while
当命令判断为假时停止

until
当命令判断为真时停止

例如:计算1-100所有偶数的和

#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
let sum+=$i
let i+=2
done
echo $sum

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

例如:猜数字游戏

#!/bin/bash
p=`echo $[RANDOM%1000+1]`
t=0
while true
do
read -p "请输入你猜的数字1-1000:" num
let t++
if [ $num -eq $p ]
then echo "恭喜你猜中了,随机数字是$p"
echo "您一共猜了${t}次";exit 0
elif [ $num -gt $p ]
then echo "您猜的数字高了"
else echo "您猜的数字低了"
fi
done

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

双重循环及跳出循环

  • break跳出单个循环后面加数字2则代表跳出两层循环

  • continue终止某次循环中的命令,但是不会完全终止命令

continue终止本次循环,继续下一次循环

如:

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

break结束当前循环,不在执行当前的循环

如:

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

sed

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

基本用法

格式:

sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道


常用选项:
-n    不输出模式空间内容到屏幕,即不自动打印
-e    多点编辑[root@www data]#sed -n -e '/^r/p'  -e'/^b/p' /etc/passwd
-f     FILE 从指定文件中读取编辑脚本
-r, -E     使用扩展正则表达式
-i.bak     备份文件并原处编辑
-s     将多个文件视为独立文件,而不是单个连续的长文件流

 -n    关闭自动打印功能

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

-r, -E     使用扩展正则表达式

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 -i   与   -i.bak        修改文件内容,与修改前备shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

sed脚本格式

格式:

sed   '地址+命令'   文件

所谓的地址就是一些参数,或规定的条件,根据这些参数和条件进行打印或修改等操作

1. 不给地址:对全文进行处理(比如行号)
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
2. 单地址:
   #(1,2,3...):指定的行,$:最后一行,需要结合选项和命令进行匹配
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
   /pattern/:被此处模式所能够匹配到的每一行,正则表达式
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
3. 地址范围:
   n,n    表示从n行到第n行,3,6 从第3行到第6行
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
   n,+m   表示从n行到n+m行,3,+4 表示从3行到第7行
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
   /pat1/,/pat2/    表示从第一个正则表达式和第二个正则表达式之间的行
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
   n,/pat/  表示从n号行为开始找到 pat为止 
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
   /pat/,n    表示找到pat后n行为止
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
4. 步进:~
     1~2 奇数行
     2~2 偶数行
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

命令
p 打印当前模式空间内容,追加到默认输出之后(要与选项-n一起使用)
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
I (大写的 i )        忽略大小写输出
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
d 删除模式空间匹配的行,并立即启用下一轮循环
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
w file 保存模式匹配的行至指定文件
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
r file 读取指定文件的文本至模式空间中匹配到的行后
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
= 为模式空间中的行打印行号
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
! 模式空间中匹配行取反处理
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 面试题:查看几点到几点之间的日志

[root@heitui opt]#sed -n '/15:41/,/15:42/p' log                #此处的log文件在opt下

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

搜索替代,类似于vim编辑器末行模式的s///g

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

函数

 格式1:

function   函数名 {

        命令序列

}

格式2:

函数名(){

        命令序列

}

格式3:

function  函数名  (){

        命令序列

}

三种格式都是同样的效果,推荐使用格式2,格式2最为简单

注意事项

  1. 函数调用,直接使用函数名即可,函数名就相当于命令

  2. 同名函数 后一个生效

  3. 调用函数一定要先定义,在调用,否则会报错

  4. 函数在调用时,不会在乎每个函数定义的顺序

定义函数和调用函数

[root@heitui ~]#fun1 () { hostname;date; }        #定义函数

[root@heitui ~]#fun1        #调用函数
heitui
2023年 08月 19日 星期六 22:10:37 CST

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

脚本中函数的位置

脚本中使用函数,一定要在调用函数之前定义函数,否则会报错

如下:错误示范

 shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 正确示范:

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

查看函数

[root@heitui ~]#declare -F     # 查看函数列表

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

[root@heitui ~]#declare -f       # 查看函数具体的内容

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

删除函数

格式:unset    函数名

[root@heitui opt]#unset fun1

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

 shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

函数的传参操作

 在调用函数的时候,直接在命令后面加上参数

格式:函数名   参数1  参数2  ...参数n

 shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

函数变量的作用范围:

  • 函数在shell脚本中仅在当前的shell环境中有效
  • shell脚本中函数的变量默认全局有效
  • 将变量限定在函数内部使用local命令

使用函数文件

创建专门存放函数的文件

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

递归函数 

计算阶乘

脚本如下:

#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
echo $[$1*$(fact $[$1-1])]
 fi
}
fact $1

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器
shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

数组

 数组分为两种:

  • 普通数组        普通数组以数字为下标
  • 关联数组        关联数组,不以数字为下标,可以使用字符串或字符为下标

数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

声明数组

#普通数组可以不事先声明,直接使用
declare -a ARRAY_NAME
#关联数组必须先声明,再使用
declare -A ARRAY_NAME

  定义数组格式:

格式1:数组名=(value0 value1 value2 value3 ......)

格式2:数组名=([0]=value [1]=value1 [2]=value2 ....)

格式3:列表名="value0 value1 value2 value3 ...... "

       数组名=($列表名)

格式4: 数组名[0]="value1"

        数组名[1]="value2"
  
        数组名[2]="value3"

查看普通数组下标:${!a[*]}

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 ${a[*]} 与 ${a[@]}的区别

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

列出数组中有多少值  使用 ${#a[*]} 或者  ${#a[@]}

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

数组切片

格式:${ARRAY[@]:offset:number}
# offset #要跳过的元素个数
# number #要取出的元素个数

# 取偏移量之后的所有元素 
{ARRAY[@]:offset}

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

免交互expect

定义

是建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题

expect默认是没有安装的,需要自己安装

[root@heitui ~]#yum install -y expect

expect使用格式:expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

expect中相关命令

  • spawn 启动新的进程(监控,捕捉)

spawn    passwd   root

  • expect 从进程接收字符串

  • send 用于向进程发送字符串

  • exp_continue 匹配多个字符串在执行动作后加此命令

  • interact 允许用户交互expect eof

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

 基本命令

(1)脚本解释器

expect 脚本中首先引入文件,表明使用的事哪一种shell

#!/usr/bin/expect

(2)spawn

spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息

例: spawn passwd root

(3)expect

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉有swpan启动的进程输出;

用于接受命令执行后的输出,然后和期望的字符串匹配

(4)send

向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\ n

例子

方式一:
expect "密码" {send "abc123\r"}     #同一行send部分要有{}

方式二:
expect "密码"  
send "abc123\r"                    # 换行send部分不需要有{}


方式三:
expect 支持多个分支
expect          #只要匹配了其中一个情况,执行相应的send 语句后退出该expect 语句
只匹配一次
expect
{
{"密码1"  {send "abc123\r"}
{"密码2"  {send "123123\r"}
{"密码3"  {send "123456\r"}

}

(5) 结束符

expect eof

表示交互结束,等待执行结束,退回到原用户,与spawn对应

比如切换到root用户,expect 脚本默认的等待时间是10s,当执行王命令后,默认停留10s后,自动切回原用户.

interact

执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端

需要注意的是,expect eof 与 interact 只能二选一

(6)set

expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1

例子: set time out 30

(7) exp_continue

exp_continue 表示允许 expect 继续向下执行指令.

exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许expect继续向下执行命令。

例如:

expect

{

"(yes/no)" {send "yes\r";exp_continue;}

"*password" {set timeout 300; send "abc123\r"}

}

注意:使用exp_continue时,如果跟踪像passwd这样输入密码后就结束进程的命令,expect {}外不要加上expect eof 因为spawn进程结束后悔默认向expect 发送eof,会导致后面的expect eof执行报错

(8)send_user

表示回显命令与echo相同

(9)接收参数(位置变量)

expect 脚本可以接受从bash命令行传递参数,使用 [lindex $argv n]获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数

例子:

set hostname [lindex $argv 0] 相当于hostname=$1

set password [lindex $argv 1] 相当于passswd=$2

expect直接执行,需要expect命令去执行脚本

例子

#!/usr/bin/expect
spawn ssh 192.168.3.101   # ssh 远程登陆,使用spawn执行
expect {
       "yes/no" { send "yes\n";exp_continue }    # 捕捉yes/no,然后发送yes,\n起到回车的作用
       "password" { send  "123123\n" }    # 继续捕捉password,然后发送magedu,\n起到回车的作用
}       
interact    # 结束符,结束后不返回原用户,停留在远程用户端上

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

shell脚本——循环语句、sed、函数、数组、免交互expect,linux,运维,服务器

脚本中使用参数的方式

set   name   [lindex $argv 0]
set    pd    [lindex $argv 1]文章来源地址https://www.toymoban.com/news/detail-665879.html

到了这里,关于shell脚本——循环语句、sed、函数、数组、免交互expect的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • shell编程之循环语句与函数

    (1)将命令序列按格式写在一起 (2)可方便重复使用命令序列 (1)使用函数可以避免代码冲突 (2)将大的工程可以分割为若干小的功能模块,代码的可读性更强 3.1方式1: [function] 函数名 () { 命令系列 [return x]————————使用return或exit可以显示地结束函数 } 3.2方

    2024年02月07日
    浏览(31)
  • 【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年02月13日
    浏览(37)
  • shell脚本while循环、read读取控制台输入与函数

    声明: 以下为个人笔记,内容不完全正确,请谨慎参考。 while循环结构 while [条件判断] do 程序 done 脚本示例: 点击查看代码 简易写法: 点击查看代码 read 读取控制台输入 基本语法: read(选项)(参数) 1、选项 -p: 指定读取值时的字符; -t: 指定读取值等待时间(秒-s)如

    2024年04月22日
    浏览(43)
  • perl脚本语言学习1——基础篇:变量、数组、哈希数组、循环、文件、函数

    2023.3.18 今天下载虚拟机把电脑磁盘内容弄到乱七八糟,难受 发现每次学习遇到一个坎,感觉面前是一座大山,越过去之后又对前途充满了希望 perl:practical extraction report language 实用提取和报表语言 从字面上看主要与文本处理相关 变量定义: my 存储 数字、字符、字符

    2024年02月12日
    浏览(60)
  • Shell脚本基础( 四: sed编辑器)

    目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法  2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6  -a 追加 2.3 搜索替代 2.4 变量 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供

    2024年02月12日
    浏览(32)
  • 【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)

    语法格式 参数说明 : path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。 expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。 1. 常用expression 以下列出

    2024年02月09日
    浏览(40)
  • Shell脚本文本三剑客之sed编辑器(拥明月入怀,揽星河入梦)

    sed编辑器可以根据命令来处理数据流中的数据,通过多种转换修改流经它的文本,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed是一个面向字符流的非交互式编辑器,也就是说 sed 不允许用户与它进行交互操作。 1.读取 sed从输入流(文件、管道、标准输

    2024年02月08日
    浏览(36)
  • 常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)

    1、第一个案例:helloworld 2、打印运行的python进程 3、获取并打印参数 4、用脚本写for循环 5、使用C语言风格的for命令 6、while循环案例 7、使用break跳出外部循环 8、使用continue命令 9、case案例 10、判断两个数是否相等 11、使用双圆括号 12、使用双方括号 13、反引号的使用 14、字

    2024年02月07日
    浏览(34)
  • shell脚本——expect脚本免交互

    目录 一.Here Document 1.1.定义 1.2.多行重定向  二.expect实现免交互 2.1.基础免交互改密码 2.2.expect定义 2.3.expect基本命令 2.4.expect实现免交互ssh主机 1.1.定义 使用I/O重定向的方式将命令列表提供给交互式程序,是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来

    2024年02月12日
    浏览(31)
  • shell脚本----条件判断语句

    文件测试 test命令 测试表达是是否成立,若成立则返回0,否则返回其他的数 用法一:test 条件表达式 用法二:[ 条件表达式 ] 选项 含义 -e 测试目录或者文件是否存在 -d 测试是否为目录 -f 测试是否为文件 -r 测试当前用户是否有读的权限 -w 测试当前用户是否有写的权限 -x 测

    2024年02月01日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包