shell编程之循环

一、for循环

for循环是Shelll中最常见的循环结构,根据书写习惯又分为列表for循环、不带列表的for循环以及类C的for循环。for循环是一种运行前的测试语句,也就是在运行任何循环体之前先要判断循环条件是否成立,只有在条件成立的情况下才会运行循环体,否则将会退出循环。每完成一次循环后,在进行下一次循环之前都会再次进行测试。

1.带列表的for循环

[root@Cfhost-170820-UCNK ~]# cat fruit01.sh
#!/bin/bash

fruits="apple orange banana pear"
for FRUIT in $fruits
do
echo "$FRUIT is John's favorite"
done
echo "No more fruits"
[root@Cfhost-170820-UCNK ~]# sh fruit01.sh
apple is John's favorite
orange is John's favorite
banana is John's favorite
pear is John's favorite
No more fruits

2.不带列表的for循环

#!/bin/bash
for VARIABLE in $@
do
echo -n $VARIABLE
done

[root@Cfhost-170820-UCNK ~]# bash for_list07.sh 1 2 3

1 2 3

 3.类C的for循环

计算1到100的和和以及1到100的奇数和

[root@Cfhost-170820-UCNK ~]# cat c_for03.sh
#!/bin/bash
sum01=0
sum02=0
for (( i=1,j=1;i<=100;i++,j+=2))
do
let "sum01+=i"
if [ $j -lt 100 ];then
let "sum02+=j"
fi
done
echo "sum01=$sum01"
echo "sum02=$sum02"
[root@Cfhost-170820-UCNK ~]# sh c_for03.sh
sum01=5050
sum02=2500

4.for的无限循环

无限循环又叫“死循环",要注意的是:和代码设计功能无关的无限循环,或者说是开发者意料之外的无限循环都属于软件bug,这类bug容易造成系统资源耗尽,造成严重的系统故障,所以要非常小心,避免出现这种问题。开发者在用循环语句的时候要尤其注意循环结束条件,有条件的要进行测试。

死循环:

#!/bin/bash

for ((;1;))

do

  echo "infinite loop"

done

5.while循环

用while循环做猜字游戏

 

[root@Cfhost-170820-UCNK ~]# cat while03.sh
#!/bin/bash
PRE_SET_NUM=8
echo "Input a number between 1 and 10"
while read GUESS
do
if [[ $GUESS -eq $PRE_SET_NUM ]];then
echo "you get the right number"
exit
else
echo "Wrong,try again"
fi
done

 

用while按行读取文件

[root@Cfhost-170820-UCNK ~]# cat while04.sh
#!/bin/bash
while read LINE

do
Name=`echo $LINE | awk '{print $1}'`
AGE=`echo $LINE | awk '{print $2}'`
Sex=`echo $LINE | awk '{print $3}'`
echo "My name is $Name,I'm $AGE years old,I'm a $Sex"
done < student_info.txt
[root@Cfhost-170820-UCNK ~]# cat student_info.txt
John 30 Boy
Sue 28 Girl
Wang 25 Boy
Xu 23 Girl

##上述这种方式,实际应用场景是可以把参数定义在另外一个文件夹,这时如果我需要改动代码传递参数,只需改配置文件即可

6.until循环

until循环也是运行前测试,但是until采用的是测试假值的方式,当测试结果为假时才继续执行循环体,知道测试为真时,才停止循环

下面使用until计算1到100的和以及1到100的奇数和

[root@Cfhost-170820-UCNK ~]# cat until01.sh
#!/bin/bash
sum01=0
sum02=0
i=1
until [[ $i -gt 100 ]]
do
let "sum01+=i"
let "j=i%2"
if [[ $j -ne 0 ]];then
let "sum02+=i"
fi
let "i+=1"
done
echo $sum01
echo $sum02

 

[root@Cfhost-170820-UCNK ~]# sh until01.sh
5050
2500

7.select循环

[root@Cfhost-170820-UCNK ~]# cat select01.sh

#!/bin/bash
echo "which car do you prefer?"

select CAR in Benz Audi VolksWagen

do

break
done

echo "You chose $CAR"

[root@Cfhost-170820-UCNK ~]# sh select01.sh
which car do you prefer?
1) Benz
2) Audi
3) VolksWagen
#? 2
You chose Audi

 

8.循环控制

#break

九九乘法表

[root@Cfhost-170820-UCNK ~]# cat break01.sh
#!/bin/bash
for ((i=1; i<=9;i++))
do
for((j=1;j<=9;j++))
do
if [[ $j -le $i ]]; then #小于等于i时运算
let "Multi=$i*$j"
echo -n "$i*$j=$Multi "
else
break #j 一旦大于i则立即停止当前循环
fi
done
echo

[root@Cfhost-170820-UCNK ~]# sh break01.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

素数

#continue

[root@Cfhost-170820-UCNK ~]# cat continue_02.sh
#!/bin/bash
for ((i=1;i<=100;i++))
do
for ((j=2;j<i;j++))
do
if !(($i%$j));then
continue 2
fi
done
echo -n "$i "
done

[root@Cfhost-170820-UCNK ~]# sh continue_02.sh
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


系ubuntu 下面打开终端输入:sudo apt-get install sendmail一般就安装完成噶啦跟住进入 /etc/mail/目录输入:m4 sendmail.mc &gt; sendmail.cf意思系跟住.mc文件 生成 sendmial.cf文件输入呢个命令:ps aux | g
依家我有1个软件goagent目录(大家懂得) 放在/home/gateman/Programs/ 下 1. proxy.py 入面有1个 proxy.py 文件 放在/home/gateman/Programs/goagent/local/ 入面 2.breakwall.sh 我在 proxy.p
其实我想讲的是 cp -L关于-L参数的解释:-L, --dereference always follow symbolic links in SOURCE意思是如果复制目标是1个软链接,则复制链接的目标 不是链接本身做个例子: 例如 ~/tmp/fo1 入面有1个c.txt 文件 和 指向他的软
原地址:http://www.rjgc.net/control/content/content.php?nid=4418 1、将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/do
chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。实例:用live CD ubuntu假设你的
简单解析下, stdin就是标准输入, stdout就是标准。举个例子, 在当前我要打包1个文件夹 /var/log/ 到当前目录下,并用zip压缩,那么我们可以分步执行#tar -cvf log.tar /var/log/#zip -r log.tar.zip log.tar#rm -rf log
转自:http://man.ddvip.com/linux/Mandrakelinuxref/process-priority.html系统中运行的每个进程都有一个优先级(亦称“nice 值”),其范围从 -20 (最高优先级)到 19 (最低优先级)。默认情况下,进程的优先级是 0 (“基本”调度
str=&quot;/home/gateman&quot; if [ ${str:0:1} = &quot;/&quot; ]; then echo &quot;yes&#39;fi ${str:0:1} 中0表示从第几个字符开始,1表示截取多长
转自:http://kwokchivu.blog.51cto.com/1128937/694347 在RedHat系统下用usermod 命令可把某用户添加进多个附属组,默认情况下,一次性添加多个附属组可用以下方式来添加: usermod -G 附属组1,附属组2,...,附属组X 用户名 但在添加
有个文件 test.txt 内容如下:bash-3.00$ cat test.txt user user user_hiuser #注:呢行系空行T JGATEMANGATTTTTEMANGABBEMANAAABbash-3.00$下面介绍下常用的通配符 配合grep 命令:1. &quot;.&q
linux系统为每1个文件都分配有i索引节点(inode),系统根据呢d节点从磁盘找出数据。 一般来讲,每1个文件名(包含全路径)实际上都链接住1个i索引节点。inode实际上系乜咧? 其实可以算系1个指向磁盘具体位置(柱面,扇区之类)的指针, 系统分析某个文件的inode,得出磁盘柱面,扇区等数据
grep 可以立即为筛选, 一般的用法系 grep + 要查询的字段 + 文件(或者内容 例如| 传递既内容)1.grep + 要查询的字段 + 文件gateman@GPC:~/shell/SQL_GSI$ grep OID a.sqlWHERE OID=@BuildNOWHERE OID INWH
原文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html开始之前人类大脑对文字的处理是平面式的,所以我们浏览文章、查找资料或者重构代码,要么是横向读,要么是纵向读,要么使用搜索功能,将文字作为一个平面整体。而在
PS:偶很喜欢用scp这个命令来传输数据。scp命令跟cp命令类似,只不过cp命令是在同一台机器上用的,scp是在两台机器上复制传输数据的命令。scp实质相当于利用SSH协议来传输数据的cp命令。 用法举例: 1、复制远程服务器的文件到本地: scp -P888 root@120.18.50.33:
打开终端,进入/bin/ls 一下会见到 bash sh 呢两个文件。其实距地系两个唔同既shell 解析器。如果在脚本a.sh 开头写入#!/bin/sh那么执行./a.sh 时候 就相当于 sh a.sh同理 开头写入#!/bin/bash执行./a.sh 时候 就相当于 bash a.sh如果
find查找文件的时候排除某个或几个文件或目录转自:http://www.cnblogs.com/starspace/archive/2008/10/20/1315380.html比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件find /usr/sam -path &quot;/
假设有变量 var=http://www.google.com/test.htm一 # 号截取,删除左边字符,保留右边字符。echo ${var#*//}其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符即删除 http://结果是 :www.goog
转自: http://edyfox.codecarver.org/html/_vimrc_for_beginners.htmlVIM 中可供用户定制的选项非常非常多,作为初学者,我们没有必要了解这么多东西。下面,滇狐简单列出了一些最常用的配置项,大家可以根据自己的需要将这些内容添加到自己的 .vim
转自:http://www.einit.com/user1/11/archives/2006/3603.htmlUnix/Linux下一般想让某个程序在后台运行,很多都是使用 &amp; 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysq
首先, mount是类unix系统, 挂载设备到1个文件夹的操作命令, 注意系设备阿正常来讲,mount 是不能挂在文件夹到文件夹的。例如, 在我的~/tmp/ 目录中有两个文件夹fo1 fo2其中fo1 中有3个文件a.txt b.txt c.txt fo2 有4个 e.txt d.txt e.t