你了解网站建设吗 软文案例,宁夏建设职业技术学院官方网站,福建建设厅官网,计算机科学与技术 开题报告 网站建设数组#xff0c;逻辑判断以及循环1. 概述 大家好#xff0c;我又来了。今天呢我们继续学习shell相关的知识。还是老样子我们先回顾下上一次【脚本交互 以及表达式】学习到的知识 登录shell 关联配置文件什么是子shellumask 修改默认权限read 基础表达式 简单计算表达式expr 计…数组逻辑判断以及循环1. 概述 大家好我又来了。今天呢我们继续学习shell相关的知识。还是老样子我们先回顾下上一次【脚本交互 以及表达式】学习到的知识 登录shell 关联配置文件什么是子shellumask 修改默认权限read 基础表达式 简单计算表达式expr 计算bc 计算测试 表达式逻辑表达式字符串表达式文件表达式数字表达式测试进阶表达式逻辑组合表达式
我们简单回顾了下上次学习的内容。废话不多说了接下来让我们一起学习新的内容
2. 数组
2.1 格式定义
格式
# 在Shell中用括号来表示数组数组元素用“空格”符号分割开。定义数组的语法格式
array_name(value1 ... valuen)格式解读
单行定义
array_name(value0 value1 value2 value3)多行定义
array_name(value0value1value2value3
)单元素定义
array_name[0]value0
array_name[1]value1
array_name[2]value22.2 具体案例
单行定义案例
[vagrantlocalhost test003]$ echo ${array1}[vagrantlocalhost test003]$ array1(11 22 33 44 55)
[vagrantlocalhost test003]$ echo ${array1}
11
[vagrantlocalhost test003]$ echo ${array1[]}
11 22 33 44 55
[vagrantlocalhost test003]$ 多行定义案例
[vagrantlocalhost test003]$ echo ${array2[]}[vagrantlocalhost test003]$ array2()
[vagrantlocalhost test003]$ array2(aabbccdd)
[vagrantlocalhost test003]$ echo ${array2[]}
aa bb cc dd
[vagrantlocalhost test003]$
单元素定义案例
[vagrantlocalhost test003]$ echo ${array3[]}[vagrantlocalhost test003]$ array3[0]bb
[vagrantlocalhost test003]$ array3[1]ff
[vagrantlocalhost test003]$ array3[2]ee
[vagrantlocalhost test003]$ echo ${array3[]}
bb ff ee
[vagrantlocalhost test003]$
命令行定义案例
[vagrantlocalhost test003]$ echo ${array4[]}[vagrantlocalhost test003]$ array4$(ls ../)
[vagrantlocalhost test003]$ echo ${array4[]}
test001 test002 test003
[vagrantlocalhost test003]$
2.3 多种取值方式
格式
基于索引找内容读取数组元素值可以根据元素的下标值来获取语法格式如下${array_name[index]}${array_name[]:起始位置:获取数量}
注意获取具体的元素内容指定其下标值从0开始获取所有的元素内容下标位置写或者*实例
[vagrantlocalhost test003]$ num_list(123 234 345 456 567)
[vagrantlocalhost test003]$ echo ${num_list[]}
123 234 345 456 567
[vagrantlocalhost test003]$ echo ${num_list[]:1:3}
234 345 456
[vagrantlocalhost test003]$ 2.4 获取数组长度
格式
在变量前面添加符号#
${#num_list[0]}实例
[vagrantlocalhost test003]$ echo ${num_list[]}
123 234 345 456 567
[vagrantlocalhost test003]$ echo ${#num_list[]}
5
[vagrantlocalhost test003]$ 2.5 获取系统所数组
格式
declare -a具体实例
[vagrantlocalhost test003]$ declare -a
declare -a BASH_ARGC()
declare -a BASH_ARGV()
declare -a BASH_LINENO()
declare -ar BASH_REMATCH()
declare -a BASH_SOURCE()
declare -ar BASH_VERSINFO([0]4 [1]2 [2]46 [3]2 [4]release [5]x86_64-redhat-linux-gnu)
declare -a DIRSTACK()
declare -a FUNCNAME()
declare -a GROUPS()
declare -a PIPESTATUS([0]0)
declare -a array1([0]11 [1]22 [2]33 [3]44 [4]55)
declare -a array2([0]aa [1]bb [2]cc [3]dd)
declare -a array3([0]bb [1]ff [2]ee)
declare -a num_list([0]123 [1]234 [2]345 [3]456 [4]567)
[vagrantlocalhost test003]$ 2.6 数组替换/ 数组删除
格式
元素内容替换array_name[index]值
注意在修改元素的时候index的值一定要保持准确元素部分内容替换可以参考字符串替换格式${array_name[index]/原内容/新内容}
注意默认是演示效果原数组未被修改如果真要更改需要结合单元素内容替换删除单元素unset array_name[index]
删除整个数组unset array_name具体案例
[vagrantlocalhost test003]$ unset array6
[vagrantlocalhost test003]$ array6(11 22 aa bb cc ddd ggg)
[vagrantlocalhost test003]$ echo ${array6}
11
[vagrantlocalhost test003]$ echo ${array6[]}
11 22 aa bb cc ddd ggg
[vagrantlocalhost test003]$ array6[0]99
[vagrantlocalhost test003]$ echo ${array6[]}
99 22 aa bb cc ddd ggg
[vagrantlocalhost test003]$ array6[5]${array6[5]/ddd/ert}
[vagrantlocalhost test003]$ echo ${array6[]}
99 22 aa bb cc ert ggg
[vagrantlocalhost test003]$ unset array6[5]
[vagrantlocalhost test003]$ echo ${array6[]}
99 22 aa bb cc ggg
[vagrantlocalhost test003]$ unset array6
[vagrantlocalhost test003]$ echo ${array6[]}[vagrantlocalhost test003]$
3. 逻辑判断
3.1 if 判断
3.1.1 格式
单分支格式
单路决策 - 单分支if语句样式if [ 条件 ]then指令fi特点单一条件只有一个输出双分支格式
双路决策 - 双分支if语句样式if [ 条件 ]then指令1else指令2fi特点单一条件两个输出多分支格式
多路决策 - 多分支if语句样式if [ 条件 ]then指令1elif [ 条件2 ]then指令2else指令3fi特点n个条件n1个输出单行格式
单行命令写法if [ 条件1 ]; then 指令1; elif [ 条件2 ]; then 指令2; ... ; else 指令n; fi3.1.2 实例
单行实例
#!/bin/bash# 单个if 判断
gender$1if [ ${gender} 男 ]
thenecho 你是男的exit
fiecho 你不是男的
双分支实例
#!/bin/bash# 双分支实例gender$1if [ ${gender} nan ]
thenecho 你是男的
elseecho 你是女的
fi
多分支实例
#!/bin/bash# 多分支实例gender$1if [ ${gender} nan ]
thenecho 你是男的
elif [ ${gender} nv ]
thenecho 你是女的
elseecho 我不知道你的性别
fi3.1.3 经典实例
3.1.3.1 奇偶数 判断
#!/bin/bash# 计算判断# 引导客户输入一个数字
read -p 请输入一个数字 num# 判断是基数 还是 偶数
if (( ${num} % 2 0 ))
thenecho 你是偶数
elseecho 你是奇数
fi3.1.3.2 正则 判断
#!/bin/bash# 表示正则判断read -p 您输入一个字符串: stringif [[ ${string} v* ]]
thenecho 你是满足以v开头的
elseecho 你不满足以v开头
fi3.2 case 判断
格式
case 变量名 in值1)指令1;;...值n)指令n;;
esac实例
#!/bin/bash# 进行case 练习判断type$1case ${type} in1)echo 你是1;;2)echo 你是2;;*)echo 你是几我也不知道;;
esac3.3 for 循环
格式
循环逻辑语法解析关键字 [ 条件 ]do执行语句done注意这里的关键字主要有四种for - 循环遍历一个元素列表while - 满足条件情况下一直循环下去until - 不满足条件情况下一直循环下去select - 一种特殊的循环遍历侧重于遍历用户输入一般结合case等语句使用实例1遍历命令列表
#!/bin/bash# 进行for循环for i in $(ls /)
doecho 您的路径是${i}
done实例2遍历参数列表
查看脚本内容
[rootlocalhost ~]# cat for_arg_list.sh
#!/bin/bash
# 功能脚本参数列表 for循环
for i in $
doecho 列表元素: ${i}
done脚本执行后效果
[rootlocalhost ~]# /bin/bash for_arg_list.sh 1 2 3
列表元素: 1
列表元素: 2
列表元素: 33.3.1 多种案例
案例1
#!/bin/bash# 进行循环案例for i in yuwen shuxue lishi
doecho 列表元素: ${i}
done案例2
#!/bin/bash# 循环for i in {1..3}
doecho 元素内容是: ${i}
done案例3
#!/bin/bash# 实现脚本参数遍历for i in $
doecho 元素内容是: ${i}
done3.3.2 综合实践
随机生成用户
#!/bin/bash# 随机创建用户user_file/tmp/user.txt# 检查是否是文件
[ -f ${user_file} ] ${user_file}# 开始批量创建用户
for i in {1..5}
do# 创建密码pwdaaa$RANDOM# 创建用户sudo useradd user-${i}# 设置密码echo ${pwd} | passwd --stdin user-${i} /dev/null 21# 开始输出信息echo 创建账号是: user-${i}, 该用户的密码是: ${pwd}echo -e 创建的账号是: \033[31;41muser-${i}\033[0m 该用户的密码是: \033[31;41m${pwd}\033[0mdone#!/bin/bash# 进行批量的用户删除for i in {1..5}
dosudo userdel -r user-${i}echo 用户【user-${i}】删除成功
done对特定的网段的主机进行扫描
#!/bin/bash# 对特定ip进行扫描base_net192.168.56
net_file/tmp/host.txt# 判断文件是否存在
if [ -f ${net_file} ]
thensudo echo ${net_file}
fifor i in {1..100}
do# 开始检测主机host_status$(ping -c1 -W1 ${base_net}.${i} /dev/null 21 echo UP || echo DOWN)sudo echo ${base_net}.${i} 主机状态: ${host_status} ${net_file}sudo echo ${base_net}.${i} 主机状态: ${host_status}
done# 输出信息
live_num$(grep UP ${net_file} | wc)
unlive_num$(grep DOWN ${net_file} | wc)echo -e \e[31m${netsub}.0 网段主机存活情况\e[0m
echo ------------------------------------
echo -e \e[32m${netsub}.0 网段存活主机数量: ${live_num}\e[0m
echo -e \e[32m${netsub}.0 网段异常主机数量: ${unlive_num}\e[0m3.3.3 循环赋值
#!/bin/bash# 进行循环赋值all_sum0
odd_sum0
even_sum0for i in {1..100}
dolet all_sumi
donefor i in {1..100..2}
dolet odd_sumi
donefor i in {0..100..2}
dolet even_sumi
doneecho -e 所有的数字之和是: \033[31m${all_sum}\033[0m
echo -e 所有的数字之和是: \033[31m${odd_sum}\033[0m
echo -e 所有的数字之和是: \033[31m${even_sum}\033[0m3.3.4 (()) 版的双括号的语法
#!/bin/bash# 使用特殊符号(()) 来进行计算all_sum0for ((i0; i100; i1))
dolet all_sumi
doneecho -e 计算结果是: \033[31m${all_sum}\033[0m3.3.4.1 综合实践命令行进度条数字
#!/bin/bash# 实现数字进度条for ((i0; i100; i1))
do// 防止信息输出的叠加采用\e[4D每次输出信息的时候光标左移4个位置信息不会出现叠加printf \e[4D%3d%% $isleep 0.1
done3.3.4.2 综合实践实现进度条
#!/bin/bash# 实现数字进度条str#
arr(| / - \\)for ((i0; i50; i1))
dolet indexi%4printf [%-50s][%d%%]%c\r $str $(($i*2)) ${arr[$index]}sleep 0.2str#
doneecho 3.3.4.3 综合实践保存数字最大值 以及最小值
#!/bin/bash
# 设定随机数比大小# 设定基本变量
declare -i min max
declare -a nums# 设定大小比较
for ((i0;i10;i))
do# 将随机数添加到数组中nums[$i]$RANDOM# 设定初始值[ $i -eq 0 ] min${nums[0]} max${nums[0]}# 设定最大值[ ${nums[$i]} $max ] max${nums[$i]}# 设定最小值[ ${nums[$i]} $min ] min${nums[$i]}
done
echo -e \e[31m 随机数的统计信息\e[0m
echo ------------------------------
echo -e \e[32m所有的随机数${nums[]}
echo -e 最大的随机数${max}
echo -e 最小的随机数${min}\e[0m3.4 while 循环
基础语法
场景只要条件满足就一直循环下去while [ 条件判断 ]do执行语句done具体实例
#!/bin/bash# 通过while 循环来执行all_num0
odd_num0
even_num0i0
while (( i 100 ))
dolet all_numilet i
donei0
while ((i100))
do((odd_numi))((i2))
donei1
while ((i100))
do((even_numi))((i2))
doneecho 累加的和是${all_num}
echo 奇数累加的和是: ${odd_num}
echo 偶数累加的和是: ${even_num}3.4.1 while read 用法
格式 while中有一种特殊的语法while read line 它可以从文本中逐行读取相关的内容然后存储到一个临时变量line中然后我们后续就可以逐行对文本内容进行操作 样式1 cat提前读
cat a.log | while read line
do echo File: ${line}
done 实例1
#!/bin/bash# 通过while read 逐行读取i0env | while read line
do((i1))echo 第${i}行内容是: ${line}
done实例2
exec 0 a.log
while read line
do echo ${line}
done实例3
while read line
doecho File: ${line}
done a.log3.5 until循环 使用方式跟while保持一致。 格式
场景只要条件不满足就一直循环下去until [ 条件判断 ]do执行语句done3.6 select 条件选择
语法格式
select 变量名 in input_list
do 循环语句
done语法解读1 select 从 input_list 获取相关的值然后输出到一个菜单列表元素格式如下序号) 菜单条目2 用户输入信息的标识使用PS3 的值默认值是#?。我们可以定制PS3环境变量3 如果用户输入菜单序号则输出菜单内容4 select的退出方式有很多种强制退出CtrlD 组合键普通退出结合break方式实例1
#!/bin/bash# 通过select 进行简单选择echo 您喜欢的系统是
select osname in HarmonyOS Linux Windows Ubuntu
doecho 您选择的系统是: ${osname}exit
done实例2
#!/bin/bash# 修改输入指令PS3请选择菜单序号: echo 请输入您喜欢的系统:
select osname in os linux window
doecho 您选择的操作系统是: ${osname}exit
done