首页 > 系统相关 >4. Shell 循环语句

4. Shell 循环语句

时间:2023-11-28 20:11:24浏览次数:43  
标签:语句 do Shell sum echo 循环 done bash

 

重点:

条件测试。

read。

Shell 环境配置。

case。

for。

find。

xargs。

gzip,bzip2,xz。

tar。

sed。

1)循环

1.1)循环执行介绍

截图.png

将某代码段重复运行多次,通常有 进入循环的条件 退出循环的条件

 

重复运行次数

循环次数 事先已知

循环次数 事先未知

 

常见的循环的命令

for

while

until

 

逻辑:程序先进入语句判断,如真则执行循环语句,然后再进行语句判断,直到语句判断失败才退出。

截图.png

 

1.2)循环 For 语句

type for

截图.png

for NAME [ in WORDS ... ] ; do CMD1 ; done

 

-- 方式 1

for 变量名 in 列表; do

循环体

done

 

-- 方式 2

for 变量名 in 列表

do

循环体

done

执行机制

依次将列表中的元素赋值给 "变量名"每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束。

如果省略 [ in WORDS ... ],此时使用位置参数变量 in "$@"。

 

[ 举例 1 ]

使用 for 循环来遍历脚本运行时传递的参数列表。

-- 编写脚本

vim for.sh

 

#!/bin/bash

for i; do

echo i=$i

done

 

-- 执行脚本

bash for.sh a b c d e

截图.png

 

命令解析

bash -x for.sh a b c d e

截图.png

 

[ 举例 2 ]

for i in a b c d e;

do

echo i=$i;

done

截图.png

 

总结:

第一个命令是一个脚本文件,可以接受 标准输入参数 作为循环变量。

第二个命令是在终端中直接运行的一行命令,它使用 硬编码的字符串列表 作为循环变量。

 

[ 举例 3 ]

使用 for 循环来遍历一个 数字范围 并打印出结果的命令。

for i in {1..10};do

echo i=$i;

done

截图.png

 

[ 举例 4 ]

使用 for 循环来 遍历当前目录下所有以 ".sh" 结尾的文件,并打印出这些文件的名称 bash /root/$i

for i in *.sh;do

echo "bash /root/$i";

done

截图.png

 

[ 举例 5 ]

计算从 1 到 100 之间的所有整数之和,并打印出结果。

sum=0:在脚本中初始化一个变量 sum,用于存储累加的和。

for i in {1..100}; do:这部分是循环的头部,使用 for 循环遍历从 1 到 100 的整数范围。${1..100} 是 Bash 的一个特性,它展开成一个包含从 1 到 100 的整数序列的列表。

let sum+=i:在循环体内,这行命令将当前循环变量 i 的值加到变量 sum 上,实现了累加操作。

echo sum=$sum:这行命令在循环结束后打印出累加的和。${sum} 会被替换为变量 sum 的值,然后将结果打印出来。

#!/bin/bash

sum=0

for i in {1..100};do

let sum+=i

done

echo sum=$sum

截图.png

 

[ 举例 6 ]

生成一个 带有彩色星号的矩阵图案,其中颜色通过 ANSI 转义码进行控制。

这个脚本 使用嵌套的循环生成一个 6x6 的矩阵,每个位置都填充了一个带有随机颜色的星号。脚本运行后,您会看到一个具有不同颜色星号的矩阵图案。

截图.png

#!/bin/bash

# 负责 竖着打印 1 - 6 行

for j in {1..6};do

# 负责控制每行中的星号数

for i in {1..6};do

echo -e "\E[1;$[RANDOM%7+31]m*\E[0m\c"

done

echo

done

截图.png

 

[ 举例 7 ]

截图.png

#!/bin/bash

# 负责 竖着打印 1 - 6 行

for j in {1..6};do

# 负责控制每行中的星号数

for i in `seq $j`;do

echo -e "\E[5;1;$[RANDOM%7+31]m*\E[0m\c"

done

echo

done

截图.png

 

[ 举例 8 ]

截图.png

#!/bin/bash

for j in {1..9};do

for i in `seq $j`;do

echo -e "\E[5;1;$[RANDOM%7+31]m ${i}x${j}=$[i*j] \E[0m \t\c"

done

echo

done

截图.png

 

1.3)循环 For 语句

语法 2

help for

截图.png

 

语法逻辑

for (( exp1; exp2; exp3 )); do COMMANDS; done

 

for (( 控制变量初始化; 条件判断表达式; 控制变量的修正表达式 ))

do

循环体

done

截图.png

 

使用 For 循环 语法 2

截图.png

#!/bin/bash

for (( sum=0,i=1; i<=100; i++ )); do

let sum+=i

done

echo sum=$sum

截图.png

 

使用 For 循环 语法 2

#!/bin/bash

for (( i=1;i<=9;i++ ));do

for (( j=1;j<=i;j++ ));do

echo -e "\E[5;1;$[RANDOM%7+31]m ${i}x${j}=$[i*j] \E[0m \t\c"

done

printf "\n"

done

截图.png

 

1.4)循环 For 案例

范例 1 :批量创建用户和并设置随机密码。

[ 创建了 10 个用户,为每个用户生成随机密码,并将用户名和密码写入日志文件。 ]

截图.png

vim user_for.sh

 

#!/bin/bash

for i in {1..10}; do

useradd user$i

PASS=`cat /dev/urandom | tr -dc '[:alnum:]' |head -c12`

echo $PASS | passwd --stdin user$i &> /dev/null

echo user$i: $PASS >> /root/user.log

echo "user$i is created"

done

截图.png

 

Windows 10:截图功能快捷键

Win + Shift + S

 

范例 2 :将指定目录下的文件所有文件的后缀改名为 bak 后缀。

截图.png

// 前置环境

mkdir -p /data/test && cd /data/test

touch {1..10}.txt

 

--

vim for_rename.sh

 

#!/bin/bash

DIR=/data/test

cd $DIR || {  echo 无法进入 $DIR; exit 1; }

for FILE in * ;do

PRE=`echo $FILE | grep -Eo ".*\."`

   mv $FILE ${PRE}bak

done

 

--

bash for_rename.sh

截图.png

 

范例 3 :要求将目录 YYYY-MM-DD/ 中所有文件,移动到 YYYY-MM/DD/ 下

1. 创建 YYYY-MM-DD 格式的目录

截图.png

--

1. 创建 YYYY-MM-DD 格式的目录

# 当前日期一年前 365 天到目前共 365 个目录

# 里面有 10 个文件 .log 后缀的文件

 

#!/bin/bash

PDIR=/data/test # 指定父目录路径

 

for i in {1..365}; do # 循环从 1 到 365

DIR=$(date -d "-$i day" +%F) # 根据当前日期倒推 i 天的日期格式

mkdir -pv $PDIR/$DIR # 创建子目录,-p 表示递归创建目录,-v 表示显示创建的目录

cd $PDIR/$DIR # 进入子目录

for j in {1..10}; do # 循环从 1 到 10

touch $RANDOM.log # 创建一个随机名称的日志文件

done

done

截图.png

 

2. 将上面的目录移动到 YYYY-MM/DD/ 下

截图.png

--

2. 将上面的目录移动到 YYYY-MM/DD/ 下

#!/bin/bash

 

DIR=/data/test # 指定目录路径

cd $DIR || { echo 无法进入 $DIR; exit 1; } # 切换到目标目录,如果失败则显示错误信息并退出

 

for subdir in *; do # 遍历目录下的子目录

YYYY_MM=$(echo $subdir | cut -d"-" -f1,2) # 提取子目录名的前两部分,即年月

DD=$(echo $subdir | cut -d"-" -f3) # 提取子目录名的第三部分,即日

[ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &> /dev/null # 如果目标日期子目录不存在,则创建

mv $subdir/* $YYYY_MM/$DD # 将子目录下的文件移动到目标日期子目录中

done

 

rm -rf $DIR/*-*-* # 删除原始子目录

截图.png

 

范例 4 :扫描一个网段:10.0.59.0/24,判断此网段中主机在线状态,将在线的主机的IP打印出来。

截图.png

vim for_host.sh

 

#!/bin/bash

 

NET=10.0.59

touch host_list.log

 

for ID in {1..254}; do

{

if ping -c1 -W1 $NET.$ID &> /dev/null; then

echo $NET.$ID is up | tee -a host_list.log

else

echo $NET.$ID is down

fi

} &

done

 

wait

截图.png

 

1.5)练习题

[ 基于 For 循环实现 ]

1、判断 /var 目录下所有文件的类型

2、添加 10 个 用户 user1-user10,密码为 8 位随机字符。

3、/etc/rc.d/rc3.d 目录下分别有多个以 K 开头和以 S 开头的文件;分别读取每个文件,以 K 开头的输出为文件加 stop,以 S 开头的输出为文件名加start,如 K34filename stop S66filename start。

4、编写脚本,提示输入正整数 n 的值,计算 1+2+…+n 的总和。

5、计算 100 以内所有能被 3 整除的整数之和。

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态。

7、打印九九乘法表

8、在 /testdir 目录下创建10个 html 文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html。

9、打印等腰三角形

10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?

 

标签:语句,do,Shell,sum,echo,循环,done,bash
From: https://www.cnblogs.com/wuhanjiayou/p/17862897.html

相关文章

  • 1. Shell 基本用法
    重点:条件测试。read。Shell环境配置。case。for。find。xargs。gzip,bzip2,xz。tar。sed。1)编程基础Linus说:Talkischeap,showmethecode。1.1)程序组成程序:算法+数据结构数据:是程序的核心数据结构:数据在计算机中的类型和组织方式算法:处理数据的方式......
  • 虚拟机打开Hbase shell
    1、打开所有hadoop的进程start-all.sh2、打开yarn的进程start-yarn.sh这是为了防止start-all.sh,没有打开所有,其实不用管他的。3、node1,node2,node3都打开zookeepercd/export/server/apache-zookeeper-3.5.6-bin/binzkServer.shstart4、打开hbase的进程sta......
  • 冒泡排序:要比较(二层循环)n*(n-1)(第一层循环)次,最大的在最后,最次大的在倒数第二,
    privatestatic voidsort(int[]w,intl,intr){//冒泡排序要比较n二层循环*(n-1)次,第一层循环      for(inti=r;i>l;i--){        for(intj=l;j<i;j++){          if(w[j]>w[j+1])          { ......
  • 秦疆的Java课程笔记:42 流程控制 增强For循环
    Java5引入的一种主要用于数组或集合的增强型for循环。这里只是先了解一下。格式如下:for(声明语句:表达式){ //代码语句}声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用于限定在循环语句块,其值与此数组元素的值相等。表达式:表达式是要访问的数组......
  • 流程控制语句
    流程控制语句(if-elif-else)1.单分支语句(if)单分支结构指的是程序根据条件的成立与否常见的单分支结构语法是if语句if条件: #条件成立,执行此处代码#示例age=20ifage>=18:print("你成年了")2.双分支语句(if-else)双分支结构也是根据条件的成立与否,选......
  • 事件循环Event loop
    事件循环总体就是对于,宏任务和微任务执行顺序的理解;今天看循环给我看的有点迷,又看了几篇,总体就是【宏任务(微任务)】=》【宏任务(微任务)】我们先执行宏任务,然后执行微任务。下一个宏任务执行之前我们要先将上一个宏任务产生的微任务给执行完毕。//位置1【存入宏任务】setTim......
  • 循环神经网络 —— LSTM 有状态模型(stateful LSTM)和无状态模型(stateless LSTM)
     相关参考:训练后的LSTM模型在进行预测时的初始h_n和c_n是什么或应该怎么设置?  Keras中对RNN网络的statefull和stateless设置:链接:https://keras.io/zh/getting-started/faq/#how-can-i-use-stateful-rnns   ===============================================  必须要承认,由......
  • Linux 高级Shell脚本与用户管理(linux文件夹备份脚本)
    本文,我们将要学习Linux高级Shell脚本以及用户管理(重点)。下面,我们将开始探索几个使用的Shell脚本,然后介绍Linux中的用户管理。Shell脚本1创建动态目录首先,我们创建一个名为 create_directories.sh的脚本文件,这个将本将用于生成指定数量且具有动态名称的目录。以下是脚本......
  • shellscript-14-检测网段内在线ip
    shellscript-14-检测网段内在线ip脚本内容#!/bin/bash#author:yolo#检测网段内在线ip,并罗列示例网段:192.168.10.0/24#遍历网段1到254foriin`seq1254`do #如果ping通,执行成功条件为真 #-c2ping两次-W2指定超时时间 ifping-c2-W2192.168.10.$i>......
  • 集合框架(一) Java中Map的常见方法的使用及循环的五种方式
    Map是Java中的一种集合,它是一种键值对的映射表,可以根据键快速获取对应的值。@[toc]##1.常见使用方式以下是Java中Map的常见方法使用示例及运行结果:###1.1存储键值对使用put()方法向Map中添加键值对:```javaMap<String,Integer>map=newHashMap<>();map.put("apple",10......