【Shell】Shell脚本(for循环,while循环,break跳出循环,continue结束本次循环)

目录

for循环

设置for 循环的分隔符

while循环

until循环

SHELL加法运算及I++

有两个命令能帮我们控制循环内部的情况:

  • break命令
  • continue命令

break命令是退出循环的一个简单方法。可以用break命令来退出任意类型的循环,包括for,while和until循环。

for循环

(如果行内有空格,一行一行读文本-必须用while不能用for)

for:Linux下Shell的for循环语句 - EasonJim - 博客园

for i in {1..10}#10 这个替换成${NUM} 不起作用

语法:for 变量名 in 条件 ; do done;

1.for循环的常见三种用法

(转自:http://t.csdn.cn/08v74
说在开头:
(1)Ubuntu系统在6.10版本后默认使用dash环境;
(2)而CentOS系统常见默认使用的是bash环境;
(3)二者存在一定的区别,部分for循环方式在dash环境下不兼容;

1.类C语言风格(只适合bash):

#1-100的求和
sum=0
for ((i=1;i<=100;i++))
do
        sum=$(($sum + $i))
done
echo $sum

2.类Python风格(只适合bash):(注意:{1. .100}中间是两个点,且与in之间保持一个空格)

#1-100的求和
sum=0
for i in {1..100} 
do
        sum=$(($sum + $i))
done
echo $sum

3.seq方式(适合bash、dash):(注意:seq 1 100使用反引号括起来,且与in之间保持一个空格)

#1-100的求和
sum=0
for i in `seq 1 100`
do
        sum=$(($sum + $i))
done
echo $sum

2.总结

(1)遇到for循环问题先不急,先确定自己的运行环境,如果需要在Ubuntu环境下运行以上三种方法,可以把dash修改为bash环境;

修改方法:Ubuntu和CentOS系统下使用for循环的区别以及bash环境修改

案例二:

列出/etc/sysconfig下所有子目录,并且使用ls -d命令查看。

脚本:

#/bin/bash
cd /etc/sysconfig

for i in `ls /etc/sysconfig`

do
    if [ -d $i ]
       then
       ls -d $i
    fi
done

结果:

[root@congji ~]# sh syscon.sh
cbq
console
modules
network-scripts

for循环有一个值得注意的地方:

案例3:

我们创建几个文件,用for循环来ls他们。

[root@congji shili]# ll 

总用量 0

-rw-r--r-- 1 root root 0 1月  16 21:16 1.txt
-rw-r--r-- 1 root root 0 1月  16 21:16 2.txt
-rw-r--r-- 1 root root 0 1月  16 21:17 3 4.txt

[root@congji shili]# for i in `ls ./`;do echo $i ;done

1.txt
2.txt
3
4.txt

所以写脚本的时候要注意

for i in {2,8,14,22}
do

ceph daemon osd.${i} perf reset all

done

设置for 循环的分隔符

https://blog.csdn.net/weixin_33011357/article/details/116939172

OLD_IFS="$IFS"   #备份原值
IFS=":"     #修改

for  var  in  $( cat demo.txt )

do

echo var;

done

IFS="$OLD_IFS"    #还原

万一不小心把IFS值设置错了,也可通过如下赋值方式使其恢复到默认值

IFS=$' \t\n'
https://blog.csdn.net/anqixiang/article/details/113360565

for写成一行

for i in `ls ./`;do echo $i ;done

while循环

while使用须知:

1、while 和“:”之间留有空格

2、while中的变量是“局部变量”,外部无法直接读取,见;https://blog.csdn.net/bandaoyu/article/details/120071476

语法 while条件;do...;done

1.利用while循环计算1到100的和:

示例代码1:

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i++
done

echo $sum

示例代码2:利用while循环计算1到100之间所有奇数之和

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i+=2
done

echo $sum

示例代码3:利用while循环计算1到100之间所有偶数之和

#!/bin/bash
i=2
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i+=2
done

echo $sum

2.利用while循环打印**

示例代码:利用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

3.使用read结合while循环读取文本文件:

读文件

示例代码1:

#!/bin/bash
file=$1                  #将位置参数1的文件名复制给file
if [ $# -lt 1 ];then      #判断用户是否输入了位置参数
  echo "Usage:$0 filepath"
  exit
fi
while read -r line   #从file文件中读取文件内容赋值给line(使用参数r会屏蔽文本中的特殊符号,只做输出不做转译)
do

  echo $line        #输出文件内容

done   <  $file

示例2:按列读取文件内容

#!/bin/bash
file=$1
if [[ $# -lt 1 ]]
then
  echo "Usage: $0 please enter you filepath"
  exit
fi
while read -r  f1 f2 f3    #将文件内容分为三列
do
  echo "file 1:$f1 ===> file 2:$f2 ===> file 3:$f3"   #按列输出文件内容

done < "$file"

用管道

但是 注意 | 管道会起子进程,子进程内的变量无法传到外面,例如:


[liuhao@slave04 ~]$ cat test.sh 
#! /bin/sh
 
x=1
echo "adasd" | while read line
do
    x=2 
done
echo $x
 
运行结果是
[liuhao@slave04 ~]$ sh test.sh 
1
原因
 
原来是因为管道|创建了新的子进程,而子进程是在独立的进程空间(Context)运行了. 需要跟父进程通信的话, 得使用进程间通信机制. 不是简单的变量问题。
 

4.while循环中的死循环:

示例:利用死循环,让用户做选择,根据客户的选择打印相应结果

(注意:while 和“:”之间留有空格)

#!/bin/bash
#打印菜单
while :
do
  echo "********************"
  echo "        menu        "
  echo "1.tima and date"
  echo "2.system info"
  echo "3.uesrs are doing"
  echo "4.exit"
  echo "********************"
  read -p "enter you choice [1-4]:" choice
#根据客户的选择做相应的操作
  case $choice in
   1)
    echo "today is `date +%Y-%m-%d`"
    echo "time is `date +%H:%M:%S`"
    read -p "press [enter] key to continue..." Key    #暂停循环,提示客户按enter键继续
    ;;
   2)
    uname -r
    read -p "press [enter] key to continue..." Key
    ;;
   3)
    w
    read -p "press [enter] key to continue..." Key
    ;;
   4)
    echo "Bye!"
    exit 0
    ;;
   *)
    echo "error"
    read -p "press [enter] key to continue..." Key
    ;;
  esac

done


原文链接:https://blog.csdn.net/wdz306ling/article/details/79602739

break

break在while循环中,我们提到了,这里来写一个脚本,加深印象

如果输入的数字小于等于3,则返回数字,如果输入的数字大于3,则返回aaaa

脚本:

#/bin/bash

read -p "please input a number: " i

if [ $i -lt 3 ]

    then

    echo $i

       break

else

    echo aaaa

fi

运行结果:

[root@congji shell]# sh break.sh 

please input a number: 1

1

[root@congji shell]# sh break.sh 

please input a number: 5

aaaa

continue结束本次循环,而break是跳出循环,要分清楚

[root@congji shell]# cat continue.sh 

#/bin/bash

for i in `seq 1 5`

do 

    echo $i

if [ $i -eq 3 ]

        then

           continue

        fi

        echo $i

done

[root@congji shell]# sh continue.sh 

[root@congji shell]# cat break.sh 

#/bin/bash

for i in `seq 1 5`

do 

     echo $i

if [ $i == 3 ]

    then

       break

fi

    echo $i

done

[root@congji shell]# sh break.sh 

对比两个脚本我们可以发现,break相当于跳出循环,结束。而continue相当于结束本次循环,开始新的循环,

#!/bin/bash
min=1
while true
do
    echo $min
    min=`expr $min + 2`
done
~       

until循环

1、语法结构:条件测试为假时执行循环体

​	until 	条件测试

​	do

​		循环体

​	done

转自;Shell脚本(for循环,while循环,break跳出循环,continue结束本次循环)_小新锐_51CTO博客

SHELL递减和递增|i++

加/减变量的最简单方法是使用 + 和 - 运算符。

i=$((i+1))

((i=i+1))

let "i=i+1"

i=$((i-1))

((i=i-1))

let "i=i-1"

此方法允许您将变量递增/递减所需的任何值。

bash 还提供赋值运算符 += 和 -= 。这些运算符用于使用运算符后指定的值递增/递减左操作数的值。

((i+=1))

let "i+=1"

((i-=1))

let "i-=1"

在 ++ 和 -- 分别运营商增量和减量,其操作 1 和返回值。

((i++))

((++i))

let "i++"

let "++i"

((i--))

((--i))

let "i--"

let "--i"

linux shell 递增,如何在 Bash 中对变量递增或者递减 https://blog.csdn.net/weixin_30143813/article/details/116920317

 

shell中不支持像普通c语言中的i++操作,默认都是字符串操作,但是通过以下几种方式可以进行变量的自增加

1、linux 用let 表示算术表达式 如下:

     i=0 

     let i +=1  或者 let 'i+=1'

2、let也可以用 (())替代,这种用法常见于for循环中

      ((i++))

for 循环中用法:

((for i=0;i<2;i++))

do

..

done

3、linux 中也可以用expr 

      i=`expr $i + 1`;

 4、还可以用如下模式  
       i=$[$i+1];
       i=$(( $i + 1 ))

---------------------
 

注意 例  1+2得不到想要的结果,只会输出1+2这个字符串

posted on 2022-10-04 01:24  bdy  阅读(467)  评论(0编辑  收藏  举报

导航