偷偷学习shell脚本之循环语句和转义字符

2023-11-19

面对列表重复任务时,if语句难以满足需求,按着顺序编写,又非常耗时间,这时候就需要使用循环语句来解决这个问题。

一、for循环语句

  • for语句需要定义一个变量和取值列表,根据不同的取值执行相同的命令,知道变量值用完。
  • 取值列表里包含多个属性相同的对象,例如:IP地址,通信录等。
#for语句结构
for 变量名 in 取值列表
do
  命令序列
done

在这里插入图片描述

示例1:for循环的入门,一般都是从求和开始,下面就先就1~100的和。
#!/bin/bash
#
sum=0
for i in {1..100}
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum

#如果算的是1~100之间每个两位数的和,即{1、3、5、7、...、99},for循环如下: 
for i in {1..100..2}
#其他都是一样的。

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

语句示例补充:下面是求1~100的和的不同表达。(都测试过,这里就不再贴图了,想试的可以复制试试)
格式一:
#!/bin/bash
#
sum=0
for i in $(seq 1 100)      #{1、3、5、...、99}相加为$(seq 1 2 100) 
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum
格式二:  
#!/bin/bash
#
sum=0
for ((i=1;i<=100;i++))     #隔一个相加, for ((i=1;i<100;i+=2))
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum
示例2:批量添加用户,用户名存放在users.txt文件中,每行一个;初始密码均设为123456
#!/bin/bash
#
a=`cat ~/test/users.txt`
for i in $a
do
  useradd $i
  echo "123456" | passwd --stdin $i &>/dev/null
done

在这里插入图片描述

示例3:根据IP地址检查主机状态;IP地址存放在ipadds.txt文件中,每行一个;
#!/bin/bash
#
a=`cat ~/test/ipadds.txt`

for i in $a
do
  ping -c 3 -i 0.5 -W 2 $i &>/dev/null
  if [ $? -eq 0 ];then
    echo "$i 主机在线"
  else
    echo "$i 主机不在线"
  fi
done

在这里插入图片描述

二、while循环语句

  • 根据特定条件反复执行一个命令序列,直到不满足条件为止。
  • 编写时可能会出现死循环,要避免这种情况发生
  • true(真)和false(假)为特殊条件测试操作,也可以在if语句的条件测试中使用。
    • true作为条件时,表示条件永远成立,无限执行,也就是死循环,需要强制终止
    • false作为条件时,表示条件不成立,不执行命令序列
#while语句结构
while 条件测试操作
do
  命令序列
done

在这里插入图片描述

示例1:批量添加用户; 用户名称以stu开头,按数字顺序进行编号; 
一共添加20个用户,即stu1、stu2、......、stu20 
初始密码均设为123456
#!/bin/bash
#
i=1
while [ $i -le 20 ]
do
  useradd stu$i
  echo "123456" | passwd --stdin $i &>/dev/null
  let i++
done

在这里插入图片描述

示例2:猜商品价格游戏;通过变量RANDOM获得随机数;提示用户猜测并记录次数,猜中后退出循环
#我这里还加了if语句填了一点其他元素。
#!/bin/bash
#
a=$(expr ${RANDOM} % 1000)
i=0
while true
do
  read -p "猜猜看我想的是哪个数,范围在0~999。" shu
  let i++
  if [ $shu -eq $a ];then
      if [ $i -le 10 ];then
        echo "太强了,你猜了$i 次就猜中了,可惜没得奖励。"
      else
        echo "猜了$i 次才猜中,你还差的远呢" 
      fi
    exit 0
  elif [ $shu -lt $a ];then
        if [ $(expr $a - $shu) -le 5 ] ;then
          echo "虽然数小了,但已经很近了,你在想想"
        else
          echo "不好意思,猜的太小了"
        fi
  else
       if [ $(expr $shu - $a) -le 5 ];then
         echo "虽然数大了,但已经很近了,你在考虑考虑"
       else
         echo "不好意思,猜大了,数再小点"
       fi
  fi
done

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

三、until循环语句

  • 与while相反,重复测试某个条件,只要条件不成立则反复执行。
  • 一般熟练运用while即可,这个很少用。
    在这里插入图片描述
示例:计算1~50的和值;通过循环累加的方式计算1~50的和值
  
#!/bin/bash
#
a=0
sum=0
until [ $a -gt 100 ]
do
  sum=$[$sum+$a]
  let a++
done
echo "1-100的和为:$sum"

在这里插入图片描述

四、结束循环----break和continue

  • break跳出单个循环
#!/bin/bash
for ((a=1; a<=5; a++))
do
	echo "outer loop: $a"
	for ((b=1; b<=50; b++))
	do
		if [ $b -eq 5 ]
		then
			break
		fi
		echo "inter loop: $b"
	done
done

在这里插入图片描述

  • continue中止某次循环中的命令,但不会完全中止整个命令
#!/bin/bash
for ((a=1; a<=15; a++))
do
	if [ $a -gt 5 ] && [ $a -lt 10 ]
	then
		continue
	fi
	echo "current value: $a"
done

在这里插入图片描述

五、IFS字段分隔符(补充)

默认包含 空格,制表符,换行符
查看命令:set | grep IFS
IFS=$' \t\n'

修改成只换行
IFS=$'\n'

IFS=:
IFS=','

IFS.OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD

输出环境变量PATH所包含的所有目录以及其中的所有可执行文件

在这里插入图片描述

六、转义字符

echo -n 表示不换行输出

echo -e 输出转义字符,将转义后的内容输出到屏幕上

常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。

\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

\n 换行,被输出的字符从"\n"处开始另起一行。

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;

\v 与\f相同;

\t 转以后表示插入tab,即横向制表符;

\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

\\ 表示插入"\"本身;
  • -n的演示:
    在这里插入图片描述
  • echo -e “\b”的用法
    在这里插入图片描述
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

偷偷学习shell脚本之循环语句和转义字符 的相关文章

  • C程序调用shell脚本

    我有一个小型 C 程序 调用 shell 脚本 myScript sh 我得到的 ret 值为 256 请帮助我了解系统调用出了什么问题 int main int ret ret system myScript sh ret gt gt r
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 如何查看正在运行的 tcsh 版本?

    如何查看我的 UNIX 终端中运行的 tcsh 的当前版本 看着那 这version多变的 echo version tcsh 6 14 00 Astron 2005 03 25 i386 intel linux options wide
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • 【MySQL】MySQL存储过程从一张表查数据插入另一张表

    测试表 CREATE TABLE demo test ID varchar 64 NOT NULL name varchar 64 DEFAULT NULL age varchar 64 DEFAULT NULL PRIMARY KEY I
  • 四种常见函数式接口

    消费型函数式接口 Consumer
  • jmeter分布式压测

    1 什么是分布式压测 由一台控制机 Master 发出命令 控制多个压力机 Slaves 执行操作 2 为什么要做分布式压测 一台压力机的 Jmeter 默认最大支持 1000 左右的并发用户数 线程数 再大的话 容易造成卡顿 无响应等情况
  • Tomcat安装与配置(详细步骤)

    本篇博文记录了Tomcat环境安装与配置的详细步骤 旨在为将来再次配置Tomcat时提供指导方法 一 下载Tomcat Tomcat官网为 https tomcat apache org 1 按照下图根据JDK版本选择对应的 Tomcat
  • Chromium多进程架构,你知道多少?

    一 前言 国内外主流的浏览器 大多采用的是谷歌的Chromium 浏览器内核 Chromium是一个多进程多线程架构的Web引擎 很多应用和底层开发者希望了解Chromium中的进程和线程的种类和用途 以便能利用相关信息提升应用的性能 为此
  • 解决Eclipse,MyEclipse出现An error has occurred,See error log for more details的错误

    src http blog sina com cn s blog 4ba5b45e0102eam8 html 现把找到的解决方法整理提供给大家 如下 方法1 在 开始 gt 运行 gt 打入 cmd 进入命令提示行后 再进入eclipse的
  • iOS编程基础-OC(八)-运行时系统的结构(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第八章 运行时系统的结构 8 1 2 运行时系统库 苹果公司提供的OC运行时系统库实现了OC的面向对象特性和动态属性 多数情况下 运行时系统库是在后台起作用 但也拥有
  • 如何使用Vue开发Electron桌面程序

    目录 一 Electron介绍 二 项目搭建 1 使用 vue cli 创建vue项目 2 安装插件 vue cli plugin electron builder 编辑 三 开发总结 1 配置项目图标 2 在Mac系统下的几个问题 3 项
  • 重要的环境变量&通配符&转义字符

    重要的环境变量 变量是系统用于可变值的数据类型 在linux中环境有几百个 都是系统运行环境的一些参数 例如 用户家目录等 输入 env 可输出所有环境变量 几个比较常见的环境变量 PATH 定义当前用户解释器搜索路径 HOME 当前用户的
  • Mac os下通过Anaconda在远程服务器配置python虚拟环境

    一 SSH管理软件 这里推荐一款本人正在使用的软件 Termius Termius是一款非常好用而且漂亮的SSH客户端 能快速远程控制服务器 可以定制自己喜欢的主题 Termius不仅涵盖了Windows Linux OSX 还变态得支持A
  • POI及EasyExcel-读写示例

    POI
  • 嵌入式杂谈之中断向量表

    虽说接触了好久的单片机或者说嵌入式开发 不过对于有些概念还是比较模糊 因此此系列将会从一些零碎的小知识点出发 慢慢的遍历整张嵌入式开发的地图 这次先来看一下中断向量表 至于为什么会提到中断向量表 主要是因为我自己在学习嵌入式Linux开发的
  • 基于51单片机的8x8x8LED光立方设计

    1 简介 本设计是以STC89C52单片机的8x8x8的LED光立方 本设计将LED光立方分成8层 分别由单片机的P1 8个IO口来控制每一层 由于采用的是共阴极所以当层电位为高电平有效 由P0口和P2的总共16个IO口来控制每层的64盏灯
  • 对视频剪辑应用灰度图像变换+Moviepy生成灰度视频处理遇到几个有意思的问题

    一 引言 最近在学习图像处理的 直方图处理 对直方图均衡处理效果感觉非常有用 以前学习Moviepy音视频剪辑时 用的卓别林的一个黑白视频片段 感觉视频的噪点比较多 画面也整体偏暗 不禁想看看如果对其进行直方图均衡会怎么样 如是开干 但进展
  • Sqli-labs靶场笔记2(Less-2~4 联合注入)

    sqli labs的Less2到Less4三道题都可以用联合注入解决 所以放到一起来记录 联合注入的基本思路方法可以看我的上一篇博客 这里只针对题目来写 Less2 还是跟Less1一样 想要夹带私货 就得要先想办法闭合 我们先输入单引号看
  • Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection

    ssh连接ubuntu之后出现Failed to connect to https changelogs ubuntu com meta release lts Check your Internet connection 解决方法如下 1
  • 命令行窗口-隐藏黑窗口

    要想cmd运行时隐藏黑窗口 最好的方法是使用vbs文件实现 1 新建run vbs 编辑内容 set ws WScript CreateObject WScript Shell ws Run run bat 0 run bat放到同目录下
  • 银联与支付宝

    摘要 银联终于要结束12年的垄断生涯 在银联12年的发展过程中 最为引人注目的就是和支付宝的多年恩怨 这十年 双方经历了从最初的会面 到不欢而散 再到各自成长和冲突 十年后 银联和支付宝都已经成为各自领域的全球顶级玩家 但是目前仍未达成实质
  • Qt项目ui文件中新添加的控件在代码中不识别的问题解决

    今天在学Qt框架的信号槽 然后发现在ui中加的控件 通过ui gt 找不到 没有识别 于是上网查找了一下问题 解决方法 添加ui控件后 执行程序 退出程序 将debug目录下的ui XXXX h拷贝到程序目录下 重新打开就可以使用新添加的控
  • 偷偷学习shell脚本之循环语句和转义字符

    目录 一 for循环语句 二 while循环语句 三 until循环语句 四 结束循环 break和continue 五 IFS字段分隔符 补充 六 转义字符 面对列表重复任务时 if语句难以满足需求 按着顺序编写 又非常耗时间 这时候就需