【Shell】Shell脚本(for循环,while循环,break跳出循环,continue结束本次循环)
目录
有两个命令能帮我们控制循环内部的情况:
- 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这个字符串