while-read
http://kling.blog.51cto.com/3320545/1252952
Shell脚本中循环语句for,while,until用法
2013-07-20 01:40:23
标签:for while unti
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://kling.blog.51cto.com/3320545/1252952
循环语句:
Bash Shell中主要提供了三种循环方式:for、while和until。
一、for循环
for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
for的语法结构如下:
1
2
3
4
for 变量 in 串行
do
执行命令
done
说明:
行1,讲串行中的字段迭代放入变量中
行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段军处理过为止。
流程图:
for.png
用例1
用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for k in $( seq 1 10 )
do
mkdir /home/kuangl/aaa${k}
cd /home/kuangl/aaa${k}
for l in $( seq 1 10 )
do
mkdir bbb${l}
cd /home/kuangl/aaa${k}
done
cd ..
done
说明:
行2,seq 用于产生从某个数到另外一个数之间的所有整数。
行4,在家目录下创建文件夹。
行6,在使用一个for循环创建文件夹
测试结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@test01 kuangl]# ll
total 80
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa1
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa10
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa2
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa3
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa4
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa5
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa6
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa7
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa8
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa9
[root@test01 kuangl]# cd aaa1
[root@test01 aaa1]# ll
total 40
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb1
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb10
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb2
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb3
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb4
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb5
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb6
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb7
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb8
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb9
1
用例2
列出var目录下各子目录占用磁盘空间的大小。
1
2
3
4
5
6
7
#!/bin/bash
DIR="/var"
cd $DIR
for k in $(ls $DIR)
do
[ -d $k ] && du -sh $k
done
说明:
行4,对/var目录中每一个文件,进行for循环处理。
行6,如果/var下的文件是目录,则使用du -sh计算该目录占用磁盘空间的大小。
测试结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@test01 scripts]# ./var.sh
276M cache
4.0K cvs
84K db
8.0K empty
4.0K ftp
4.0K games
4.0K gdm
21G lib
4.0K local
16K lock
7.4G log
4.0K logs
0 mail
4.0K nis
4.0K opt
4.0K preserve
336K run
3.7G spool
212K tmp
4.1G www
4.0K yp
二、while循环
while循环的语法:
1
2
3
4
while 条件测试
do
执行命令
done
说明:
行1,首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则
不进入循环,介绍while 命令
行3,执行命令区域,这些命令中,应该要有改变条件测试的命令,这样,才有机会在
有限步骤后结束执行while循环(除非想要执行无穷循环)。
行4,回到行1,执行while命令
流程图:
while.png
用例1
while循环,经典的用法是搭配转向输入,读取文件的内容,做法如下:
1
2
3
4
5
#!/bin/bash
while read kuangl
do
echo ${kuangl}
done < /home/kuangl/scripts/testfile
说明:
行2,使用read有标准输入读取数据,放入变量kuangl中,如果读到的数据非空,就进入循环。
行4,把改行数据显示出来
行5,将/home/kuangl/scripts/testfile的内容转向输入将给read读取。
测试结果:
1
2
3
[root@test01 scripts]# ./while_test01.sh
aaaaaaa
bbbbbbb
用例2:
1
2
3
4
5
6
7
8
9
#!/bin/bash
declare -i i=1
declare -i sum=0
while ((i<=10))
do
let sum+=i
let ++i
done
echo $sum
说明:
行2-3,声明i和sum为整数型
行4,如果条件测试:只要i值小于或者等于10,就执行循环。
行6,sum+=i和sum=sum+i是一样的,sum累加上i。
行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。
行8,遇到done,回到行6去执行条件测试
行9,显示sum的值为55
测试结果:
1
2
[root@test01 scripts]# ./while_02.sh
55
1
三、until循环
while循环的条件测试是测真值,until循环则是测假值。
until循环的语法:
1
2
3
4
until 条件测试
do
执行命令
done
说明:
行1,如果条件测试结果为假(传回值不为0),就进入循环。
行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。
行4,回到行1,执行until命令。
流程图:
until.png
用例1:
1
2
3
4
5
6
7
8
9
#!/bin/bash
declare -i i=10
declare -i sum=0
until ((i>10))
do
let sum+=i
let ++i
done
echo $sum
说明:
行2-3,声明i和sum为整数型
行4,如果条件测试:只要i值未超过10,就进入循环。
行6,sum+=i和sum=sum+i是一样的,sum累加上i。
行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。
行8,遇到done,回到行6去执行条件测试
行9,显示sum的值为10
测试结果:
1
2
[root@test01 scripts]# ./until_test01.sh
10
本文出自 “&思远晨曦” 博客,请务必保留此出处http://kling.blog.51cto.com/3320545/1252952
http://blog.sina.com.cn/s/blog_674663290101g2i1.html
http://blog.csdn.net/sz_zh/article/details/7876232
read是Linux的一个命令,主要完成用户的交互输入。
参数如下:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志,会举例说 明。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以时候命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽,如果没有该选项,则作为一个转义字符,有的话 就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入。
while 语句
while 命令/条件
do
语句
done
用法:如果while后的命令条件为真,则执行do和done之间的语句,执行完成后,再次判断while后的命令和条件;如果while后的命令执行失败,或条件为假,循环结束。
根据个人需要写的一段限定时间内输入Y/N的脚本如下:
[javascript] view plaincopy
while : # loop
do
if read -t 5 -n 1 -p "Do you want to update Recovery [Y/N]:" #limited time 5s
then
case $REPLY in
Y|y) #Y
RECOVERY_Recovery=1;
echo -e "\n Update Recovery\n"
break
;;
N|n) #N
RECOVERY_Recovery=0;
echo -e "\n Not Update Recovery\n"
break
;;
*) #input error repeat
echo -e "\n input parameter error !! \n"
continue
esac
else #timeover
RECOVERY_Recovery=0;
echo -e "\n Not Update Recovery\n"
break
fi
done
我的备份
1 #!/bin/sh
2 n=3
3 s=2
4 j=(1 10)
5 while read -a k
6 do
7 for((i=0;i<$s;i++))
8 do
9 # echo $[${k[$n+i]}*${j[i]}]
10 ((var+=$[${k[$n+i]}*${j[i]}]))
11 done
12 echo $var
13 done f3.txt
http://www.cnblogs.com/iloveyoucc/archive/2012/04/16/2451328.html
linux read 用法
1、基本读取
read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说)。得到输入后,read命令将数据放入一个标准变量中。下面是 read命令
的最简单形式::
#!/bin/bash
echo -n "Enter your name:" //参数-n的作用是不换行,echo默认是换行
read name //从键盘输入
echo "hello $name,welcome to my program" //显示信息
exit 0 //退出shell程序。
//********************************
由于read命令提供了-p参数,允许在read命令行中直接指定一个提示。
所以上面的脚本可以简写成下面的脚本::
#!/bin/bash
read -p "Enter your name:" name
echo "hello $name, welcome to my program"
exit 0
在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数 据个数过多,则最后所有的值都给第一个变量。如果太少输入不会结束。
//*****************************************
在read命令行中也可以不指定变量.如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中。
例如::
read -p "Enter a number"
环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY.
2、计时输入.
使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个 计时器。
-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态;
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name ,welcome to my script"
else
echo "sorry,too slow"
fi
exit 0
除了输入时间计时,还可以设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。
#!/bin/bash
read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
echo "fine ,continue";;
N | n)
echo "ok,good bye";;
*)
echo "error choice";;
esac
exit 0
该例子使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即
接受输入并将其传给变量。无需按回车键。
3、默读(输入不显示在监视器上)
有时会需要脚本用户输入,但不希望输入的数据显示在监视器上。典型的例子就是输入密码,当然还有很多其他需要隐藏的数据。
-s选项能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是 read命令将文本颜色设置成与背景相同的颜色)。
#!/bin/bash
read -s -p "Enter your password:" pass
echo "your password is $pass"
exit 0
4、读文件
最后,还可以使用read命令读取Linux系统上的文件。
每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。
读取文件的关键是如何将文本中的数据传送给read命令。
最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的 while命令
例子::
#!/bin/bash
count=1 //赋值语句,不加空格
cat test | while read line //cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ] //注意中括号中的空格。
done
echo "finish"
exit 0
http://blog.csdn.net/junmail/article/details/4912065
1、准备数据文件
$cat a.txt
200:2
300:3
400:4
500:5
2、用while循环从文件中读取数据
#!/bin/ksh
while read line
do
echo $line
done < a.txt
运行shell,结果如下:
200:2
300:3
400:4
500:5
3、使用IFS读文件
说明:默认情况下IFS是空格,如果需要使用其它的需要重新赋值
#!/bin/ksh
IFS=:
while read field1 field2
do
echo $field1$field2
done < a.txt
运行shell,结果如下:
2002
3003
4004
5005