shell脚本——循环语句

一、输出字符串或提取Shell变量的值——echo命令

echo [参数] [字符串]
转义符 号含义
-n表示输出不换行
-E禁止反斜杠转义,与-e参数功能相反
-e输出转义字符,将转义后的内容输出到屏幕上
\b相当于退格键,但前提是“\b”后存在字符;“\b"表示删除前一个字符;”\b\b"表示删除前两个字符
\c不换行输出。后面无字符时相当于 echo -n;"\c"后有字符时,将不被输出
\n换行,但是换行后的新行从“\n”处开始另起一行
\f换行,但是换行后的新行的开头位置连接着上一行的行尾
\v与\f相同
\t转义后表示插入tab,即横向制表符
\r光标移至行首,但不换行,相当于使用“\r”以后的数字覆盖之前相等长度的字符
| 表示插入“\”本身

案例一:echo -n 不换行输出

#!/bin/bash
echo k
echo i
echo r
echo o
echo "......"
echo -n k
echo -n i
echo -n r
echo -n o          

在这里插入图片描述

案例二:echo -e 转义字符;\b 退格 不换行输出
在这里插入图片描述
案例三:echo -e \c不换行输出
在这里插入图片描述
案例四: \n 换行输出
在这里插入图片描述
案例五:\f 、\v换行输出

在这里插入图片描述
案例六:\r光标移至行首不换行
在这里插入图片描述
案例七:删除字符的方法:
在这里插入图片描述

二、for循环语句

读取不同的变量值,用来逐个执行同一组命令

  • 用法:

读取不同的变量值,用来逐个执行同一组命令

for循环经常使用在已经知道要进行多少次循环的场景

  • 格式:
for  变量名  in  取值列表
do
	命令序列
done

在这里插入图片描述
案例一:循环出0到10之间的整数


法一:
#!/bin/bash
for i in {1..10}
  do
    echo $i
  done
 
法二:
#!/bin/bash
for i in $(seq 1 10)
do
  echo $i
done

在这里插入图片描述
案例二:查看当前目录下所有内容

[root@Kiro shell]# for k in *;do echo $k;done
for.sh
sum.sh
teacher.sh
test.sh
test.txt
user.sh
vars.sh

案例二:查看当前目录下所有内容
在这里插入图片描述
案例三:求20以内偶数和

#!/bin/bash
sum=0
for i in {2..20..2}
do
        sum=$[sum+i]
        let i++
done
echo "20以内的偶数和为:$sum

在这里插入图片描述
案例四:批量创建用户并修改密码

#!/bin/bash
for user in {1..3}
  do
   echo user${user}|xargs -n1 useradd
   echo "123456"|passwd --stdin user${user}
  done

在这里插入图片描述
案例五:根据ip地址列表检查主机状态

#!/bin/bash

IPLIST=$(cat /root/shell/ip.txt)
for IP in $IPLIST
do
ping -c 3 -i 0.5 $IP &> /dev/null
        if [ $? -eq 0 ];then
        echo "host $IP is up."
      else
        echo "host $IP is down."
      fi
done    

在这里插入图片描述

案例六:三次机会验证密码

#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入密码:" pass
        if [ $pass == $init ];then
        echo "密码正确"
        exit
        fi
done

在这里插入图片描述
抽奖小游戏

#!/bin/bash
a=0
b=0
c=0
d=0
for ((i=1;i<=10;i++))
  do
        num=$(expr $[RANDOM%4+2])
        LIST=$(cat /root/shell/users.txt |grep "$num" | awk -F: '{print $2}' )
        case $LIST in
        huahua)
        let a++
        ;;
        duoduo)
        let b++
        ;;
        sansan)
        let c++
        ;;
        *)
        let d++
       esac
        echo "$LIST"
done
        echo "huahua: $a 次,duoduo: $b 次,sansan $c 次,其他: $d 次"

在这里插入图片描述
在这里插入图片描述
画星星

#!/bin/bash
read -p "请输入你想要的星星规则:" start
for ((i=1;i<=start;i++))
do
        for  ((j=1;j<=$start;j++))
        do
        echo -n "*"
        done
echo
done

在这里插入图片描述
九九乘法表

#!/bin/bash
for i in {9..1..-1}
do
for j in `seq $i`
do
  echo -e -n "${i}x${j}=$[ $i * $j ]\t"
done
echo
done

在这里插入图片描述

三、while循环

只要条件成立,则反复循环,不成立即停止

while 条件测试操作
do
   命令序列
done

在这里插入图片描述
案例1:利用while循环打印一个5x5的*

#!/bin/bash
i=1
j=1
  while [ $i -le 5 ]
do
     while [ $j -le 5 ] 
    do
  echo -n "* " 
  let j++
    done
       echo 
       let i++
       let j=1
done

在这里插入图片描述
案例二:批量添加规律编号用户

#!/bin/bash

NAME="user"
i=1
while [ $i -le 20 ]
do
        useradd ${NAME}$i
        echo "123456" |passwd --stdin ${NAME}$i &>/dev/null
        let i++
done

在这里插入图片描述
附赠一个批量删除:

#!/bin/bash
cd /home
i=1
NAME="user"

while [ $i -le 20 ]
do
        userdel -r ${NAME}$i
        let i++
done

while 猜数字小游戏

#!/bin/bash

pc_num=$[RANDOM%3+1]
count=0
while true
do
   read -p "请输入一个数字:" user_num
   if [ $user_num -eq $pc_num ]
   then
      echo "答对啦"
      break
   elif [ $user_num -gt $pc_num ]
   then
      echo "你的数字太大了"
   else
      echo "你的数字太小了"
   fi
   let count++
done
   echo 你输入的次数为:$count

在这里插入图片描述

四、until 循环语句结构

重复测试某个条件,只要条件不成立则反复循环

while 条件测试操作
do
   命令序列
done

在这里插入图片描述
案例:求50到100的和

#!/bin/bash
sum=0
i=50
until [ $i gt 100]
 do
  sum=$[sum+i]
  let i++
done
echo "{50..100}的和:$sum"

在这里插入图片描述

【扩充】

break 和 cotinue 命令

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  在Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。   可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示:   root:x:0:0:root:/root:/bin/bash   zxj:x:500:500:zxj303:/home/zxj:/bin/bash    . .   在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 在屏幕上显示当前所有用户的记录 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 只在屏幕上显示用户名和用户ID 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 查询并显示特定用户的记录 往passwd文件里增加新的用户记录 从passwd文件里删除某个用户记录   你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。   可能你还需要查询一些Unix/Linux命令,比如awk,、sort、tr、cut、paste、sed、grep;你也可能还需要查询其他的Unix/Linux命令。   建议你在主目录下建立一个以 xx xx xx(xx xx xx为学号)命名的目录,并且在本次作业中使用它作为工作目录。 主脚本文件中的菜单   在menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。 用户信息主菜单 打印当前所有记录 打印当前所有记录(格式化后的) 打印用户名和用户ID 打印(格式化了的)用户名和用户ID 查询特定记录 增加新记录 删除记录 Q——退出 你的选择是:(等待用户输入)   当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。你必须用while循环和case条件语句配合来完成此操作。另外在显示主菜单前必须先清除用户屏幕。在以下所有步骤中,当显示主菜单前都需要先清屏。   在menu脚本文件的前面部分你首先要定义三个变量,这三个变量分别存放passwd、add、delete文件的文件名,并且能在所有涉及到passwd、add、delete文件的语句中使用他们。 比如,可以定义成:           record_file=passwd   在所有访问passwd文件的语句中,只要使用 $record_file 即可。这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:   add_file=add   delete_file=delete   定义以上变量之后,你必须核对menu脚本文件,看看所需的文件(passwd、add、delete)是否准确存放在当前目录下。如果其中任何一个不存在,你的脚本menu文件就必须显示以下信息,然后退出:   Required file theMissingFile does not exist.(所需文件不存在)   比如,如果passwd文件不存在,就显示“Required file passwd does not exist.(所需文件记录不存在)”然后退出。   在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续``````”(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。可以允许用户使用Q或q退出。   在以上等待用户做出选择的菜单中,如果用户简单地按了回车键(而不是输代码)的话,就会出现信息“Selection not entered. Press Enter to continue…"(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。   当用户选择了第一项——打印当前所有用户记录   以下是当用户在主菜单中选择第一个选项后,menu脚本文件输出的内容的例子:    (此处是主菜单—略) 你的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值