通过shell例子来学习循环结构的语法
心得: 所谓有用就是学会了一直在使用,不经常用叫没多大用,忘记了就叫没用。反过来想想经常挨领导批的很有可能是领导对你有很大的期望。所以我们学会的东西要经常用到实际中去才是自己的东西。
www.zhishiwu.com
其实学习的最好方法就是先接触实际的东西,用实践来验证理论。
写脚本编写要求证,可以一边测试一边写(中间最好有个输出标记看到哪儿错了)。
下面的例子在林夕昱老师的视频里看到的,自己为了练习在centos的系统下默写下来了,可能是刚学吧,总是写下来执行后得到好多提示(当然了这些提示是错误信息的了,不过对我这个初学者挺有帮助的,希望初学者看过林老师的视频知道思路后一定要自己试着写下来练习才是)。在这里想通过自己看过视频后做个笔记吧,也是帮助自己更快进步。废话不说了,看例子吧
www.zhishiwu.com
example 1:该脚本是让用户输入目录,然后脚本会先判断是不是目录或为空否,如是目录会先列出目录下的文件,然后一个一个判断文件的类型,在判断文件的权限。最后列出用户输入目录下的文件的类型和权限。
#!/bin/bash
#program:use for to display a directory's filetype and permission
#history:2013-02-20 ASK first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "please you input a directory:" dir
if [ -z "$dir" -o ! -d "$dir" ]; then
echo "you have input nothing or $dir is NOT a directory"
exit 0
fi
filen=`ls $dir`
for filename in $filen
do
[ -c $dir/$filename ] && filetype="is character file"
[ -p $dir/$filename ] && filetype="is PIPE file"
[ -f $dir/$filename ] && filetype="is regular file"
[ -L $dir/$filename ] && filetype="is link file"
[ -S $dir/$filename ] && filetype="is sokkt file"
[ -d $dir/$filename ] && filetype="is directory"
[ -b $dir/$filename ] && filetype="is block file"
[ -r $dir/$filename ] && per="$per readable"
[ -w $dir/$filename ] && per="$per writeable"
[ -o $dir/$filename ] && per="$per executable"
[ -u $dir/$filename ] && per="$per set UID"
[ -g $dir/$filename ] && per="$per set GID"
[ -k $dir/$filename ] && per="$per set Sticky bit"
echo "this file $dir/$filename is $filetype ,and permission is $per "
filetype=""
per=""
done
注释:
第一行是该shell脚本运行的环境,可以不用写。运行环境很多,有/bin/awk -f的还有其他的。
第二行是该脚本的信息说明干什么用的。一般shell脚本中以#开头的都是注释行,shell不会去执行的。
第三行也是脚本的一些信息,写明日期和作者,还有版本信息。
第四行就是指该脚本运行的路径了。比如脚本中的echo命令,这些命令一般要注明绝对路径的。路经有好多写明最主要的那个。
第五行就是使用export命令让路径在全局环境中生效了,而不仅是当前用户的当前shell环境。
**************以上的这几行都是一些准备工作,不过最好养成好的习惯**************
第七行是使用read定义一个交互的变量。等待用户输入后read函数读取屏幕的值,并付给dir变量。双引号中的信息是出现在屏幕的提示信息。这个经常用到哦
*********************第八行到第十一行是一种简单的if结构语句,当中括号中的条件为真时执行第九行和第十行的程序段。该结构以if开头和fi结尾。**************************
第八行是test的一个测试用例。test和中括号的作用一样。可以写成test -z $dir形式。中括号中有两个test命令模式,这两个是或的关系用-o来表示。如可以写成 test -z $dir || test -d $dir这样的形式。-z是测试是否为空,如果是空返回真,-d是测试是否为目录。如果不知道这个命令是否会得到自己的答案是可以在命令状态下先试试。比如我想得到为真可以这样测试 test -d /root && echo "this /root is a directory" || echo "this /root is NOT a directory"。如果屏幕输出this /root is a directroy表示test为真,因为两个之间的关系是与的关系。相反屏幕输出this /root is NOT a directory 说明||前面的为假。因为||前面和||后面的关系是或的关系。
第八行的意思是当输入的目录为空或者不是目录时执行第九和第十程序段。
第九行是当第八行为真时执行的输出双引号里的内容
第十行是退出脚本执行。 www.zhishiwu.com
第十一行是if结构的结束标志。
第十二行是赋值。把ls得到的数据赋值给filen。这里有个反引号(就是ESC键下方的波浪号的那个键)的作用是执行里面的命令。需要记住的是和双引号、单引号的区别。
***第十三行到第三十四行是for循环结构。第15到第21是判断什么文件类型的,第23到第28是判断是权限的。这是一种for循环的结构。for中间都是以do开始的程序段以done结尾的。**
中间的就不说了,讲讲主要的1、第23到第28中per=$per……是说明权限不仅仅是一种,因此要写成这样的格式进行累加。2、filetype和per最后又多次一举赋值为空,是因为这些权限和类型再循环时是会累加的。
example 2:该脚本通过不同的循环来说明1-100的累加。比如for、while、until等。
先使用while。while是当条件为真时执行do到done的程序段。为假时退出程序段循环。
#!/bin/bash
#program:use while to add 1 to 100
#history:2013-02-20 ASK first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
i=0
s=0
while [ $i -lt 100 ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "1+2+3...+$i=$s"
或者使用until。和while的区别是until当遇到条件为真时退出当前循环。一定要和while分清
#!/bin/bash
#program:use until to add 1 to 100
#history:2013-02-20 ASK first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
i=0
s=0
until [ $i -eq 100 ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "1+2+3...+$i=$s"
或者使用for循环来执行 。
#!/bin/bash
#program:use for to add 1 to 100
#history:2013-02-20 ASK first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0
for((i=0;i<=100;i++))
do
s=$(($s+$i))
done
echo "1+2+3...+$i=$s" ######这行执行后会输出1+2+3...+101=5050。这个101是和i++
注释: www.zhishiwu.com
第一:先说说运算。运算的结构是$(( ))。比如a=$(($b+$c))意思就是把b和c的值相加赋给a。再如((num=2#11111111))这个是把8个1的二进制转换为十进制。也就是说双左小括号((和双又小括号))组成运算的格式。相乘的话就是a=$(($b*$c))。
第二:再说说这个eq、lt、gt等。记住e是等于、l是小于、g是大于就是了很好记住的。equal(等于)greater than(比..大于)less than (比 小于)。
第三:最后说说for的第二种格式也就是最后一个例子中提及的for((初始值;限制值;步长))格式。至于i++和++i的却是有不同的自己可以去网上看看。
回顾:
1、结构:if、for、while、until等以及各自的区别
2、测试和关系语句:test和[]、关系的处理 &&、||、!、-a、-o等等
3、赋值:read -p、直接赋值的、重复赋值的。
4、引号:单引号、双引号、反引号等区别