shell 中 for循环、while循环、函数

一、for循环

1.1循环的格式

for 变量 in 列表
do
    代码
    代码
    ...
done

循环的逻辑:

        将列表的每一元素逐一赋值给变量,每复制一次,do和done之间的代码就会执行一次

 1.2 列表的生成方式

方法1:直接给出列表元素

方法2:用通配符来生成元素

方法3:用命令来生成元素

方法4:用{ }展开的形式生成元素

1.3 案例

生成数字列表

案例1:输出1-100之间的数字

#!/bin/bash
clear 
echo ""
echo --------------程序开始执行---------------
for num in {1..100}
do
    echo $num
    sleep 0.5
done
echo --------------程序执行结束----------------

案例2:输出ip地址,范围是192.168.1-10

#!/bin/bash
for num in {1..10}
do
    ip="192.168.1.$num"
done

案例3:检查192.168.1.-10中的在线主机

#!/bin/bash
for num in {1..10}
do
    ip="192.168.1.$num"
    if ping -c1 -W1 $ip &> /dev/null;then
        echo "$ip is online"
    else
        echo "ip is offline"
    fi
    sleep 0.5 
done

生成字符串列表

案例:

#!/bin/bash
for name in {a..f}
do
    touch /tmp/$name.txt
done

生成文件名列表

案例1:输出etc下的每个文件名

#!/bin/bash
for fileName in `ls /etc/`
do
    echo "$fileName"
    sleep 0.5
done

案例2:判断etc下的每一个文件的文件类型

方法1:

#!/bin/bash
for fileName in `ls /etc/`
do
    if [ -f /etc/$fileName ];then
        echo "$fileName 是一般文件"
    elif [ -d /etc/$fileName ];then
        echo "$fileName 是目录文件"
    else
        echo "$flieName 是其他文件"
    fi
    sleep 0.5
 
done

方法2:

#!/bin/bash
for fileName in /etc/*
do
    if [ -f $fileName ];then
        echo "$fileName 是一般文件"
    elif [ -d $fileName ];then
        echo "$fileName 是目录文件"
    else 
        echo "$flieName 是其他类型文件"
    fi
    sleep 0.5
done

 二、while 循环

2.1 while循环的格式

格式1:正常循环的格式

while 条件
do
    代码
    代码
done

格式2:读取文件格式

while read line 
do 
    代码
    代码
done<<文件名

案例1:输出/etc/passwd中的每一行有多少个字符,要求显示第几行有多少个字符

#!/bin/bash
m=1
while read line 
do
    nums=`echo $line | wc -c
    echo "第$m行有$nums个字符"
    m=$[$m+1]
done</etc/passwd

 案例2:输出每个用户的的用户名和shell类型

#!/bin/bash
while read line
do
    name=`echo $line | awk -F ":" '{print $1}'`
    stype=`echo $line | awk -F ":" '{print $NF}'
    echo "用户$name 的shell类型是 $stype"

done</etc/passwd

案例3:输出1-100之间的数字

#!/bin/nash

num=1

while [ $num -le 100 ]
do
    echo $num
    num=$[$num+1]

done

案例4:每隔5s检查一次bom是否登录系统

#!/bin/bash

while ture 
do
    sleep 5
    if who | grep "^bom\>" &> /dev/null;then
        echo "bom is online"
        exit 5
    else
        echo "bom is offline"
    fi
done

三、循环控制

break : 终止循环-直接跳出循环

continue : 立刻终止这次循环,直接进行下一次循环

案例 1:

while true
do
    slepp 5
    if who | grep "^bom\>" &> /dev/null;then
        break
    else 
        echo "bom is offline"
        continue
    fi
done
echo "bom is online"

案例2:九九乘法表

#!/bin/bash
for second in {1..9}
do
    for first in {1..9}
    do
        sum=$[$first*$second]
        echo -n "$first*$second=$num"  #输出换行
        
        if [ $first -eq $second ];then
            break
        fi 
    done
    echo

done

四、函数

函数就是一段代码 ,通过使用函数可以实现代码的复用,降低代码的冗余度,提高开发效率

 定义函数的格式

函数名 ()
{
代码
代码
}

注意:函数无法直接直接运行,必须在调用的时候,才能运行

调用的函数的格式:函数名

案例:

#!/bin/bash
fun1()
{
echo "函数开始了"
echo "今天星期四"
echo "函数结束了"
}

echo "start"
fun1
echo "stop"

五、变量

5.1 类型

环境变量:linux内置的变量
自定义变量:用户自己定义的的变量
位置变量:用于向脚本/函数传递参数

5.2 环境变量

一般环境变量都是大写的

PATH :定义搜索命令的路径

USER:当前用户的用户名

HOME: 当前用户的家目录

PS1: 当前用户的提示符

PS2:当前用户的续行符

SHELL :当前用户的shell类型

UID:当前用户的uid

环境变量配置文件 

用户环境变量配置环境:在家目录下, .bashrc  .bash_profile

系统用户变量配置文件:/etc 下 , bashrc 和 profile 

六、位置变量 

位置变量,也称之为位置参数 ,作用是用于向函数或者向脚本传递参数的

接收数据的位置变量是 :$0 $1 $2 $3 $$ $#
$# 参数的个数
$0 脚本名称
$1..... 第几个参数

案例1:

#!/bin/bash
if [ $# -ne 3 ];then
    echo "error" 参数错误
    echo "Usage $0 姓名 年龄 性别"
    exit 4
    
fi
echo "-------------程序开始执行------------------"
echo "姓名:$1"
echo "年龄:$2"
echo "性别:$3"
echo "脚本名称:$0"
echo "脚本参数个数:$#"

 案例2:通过函数,判断两个数字的大小,输出较大的位数字

#!/bin/bash
read -p "请输入数值1:" num1
read -p "请输入数值2:" num2

fun1()
{
    m=$1
    n=$2
    if [ $m -gt $n ];then
        echo "$m"
    else
        echo "$n"
    fi

}

fun1 $num1 $num2

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在for循环,如果想要在读取到换行符"\n"时跳出循环,可以使用一个boolean变量来判断。在每次循环开始前,将boolean变量设置为true。然后在循环体内读取输入,如果读取到的是"\n",则将boolean变量设置为false,跳出循环。以下是一个示例代码: ```java boolean flag = true; for (int i = 0; flag; i++) { System.out.println("请输入姓名:"); String name = input.next(); student.setName(name); if (name.equals("\n")) { flag = false; } // 其他操作 } System.out.println("退出程序!"); ``` 在这个示例循环会一直进行,直到读取到换行符"\n"时才会跳出循环。请注意,这只是一个示例,具体的实现方式可能会根据具体的需求而有所不同。 #### 引用[.reference_title] - *1* [JAVA-for循环的流程控制和跳出循环判断](https://blog.csdn.net/gitets/article/details/109660007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [shell循环for与while和如何跳出循环以及函数的使用](https://blog.csdn.net/weixin_55890510/article/details/125979978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值