分享
 
 
 

unix下shell编程-shell编程简介(包含循环和分支语句)

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

介绍shell编程目标:完成这一章,你能做以下事情:写出简单的shell程序 通过环境变量传递参数给shell程序 通过位置参数传递参数给shell程序 使用特殊shell变量,*和# 使用shift和read命令 1.1 shell编程概述shell程序是一个包含UNIX命令的普通文件。 这个文件的许可权限至少应该为可读和可执行。 在shell提示符下键入文件名就可执行shell程序。

shell程序可以通过三种方式接受数据: 

-环境变量

-命令行参数

-用户的输入shell是一个命令解释器,它会解释并执行命令提示符下输入的命令。但是,你可能想要多次执行一组命令,shell提供了一种功能,让你将这组命令存放在一个文件中,然后你可以象unix系统提供的其他程序一样执行这个文件,这个命令文件就叫做shell程序或者shell脚本。当你运行这个文件,它会象你在命令行输入这些命令一样地执行这些命令。为了让shell能读取并且执行你的shell程序,shell脚本的文件权限必须被设置为可读和可执行。为了让shell可以找到你的程序,你可以选择输入完全路径名,或者将这个脚本的路径放在于你的PATH环境变量指定的路径列表中。许多的用户会在他们的HOME目录下创建一个bin目录来存放他们自己开发的script,然后将$HOME/bin加入到他们的PATH环境变量中。你可以写出非常复杂的shell脚本,因为shell脚本支持变量、命令行参数、交互式输入、tests(判断))、branches(分支),和loops(循环)等复杂的结构。1.2 shell程序举例$ cat myprog#this is the program myprogdatels –F$ myprog要创建一个shell程序,考虑进行以下步骤:$ vi myprog 

一个包含shell命令的程序。#this is the program myprogdate ls –F$ chmod +x myprog 增加文件的执行模式$ myprogThu Jul 11 11:10 EDT 1994F1 f2 memo/ myprog*首先使用一个文本编辑器创建一个shell程序myprog。在程序执行之前,这个文件必须被赋予可执行的权限。然后在命令提示符下输入这个程序名,如上例所示,当myprog执行的时候,一个子shell会被创建。这个子shell会从shell程序文件myprog读取输入而不是从命令行读取输入,这个shell中的每个命令的执行都会创建一个子shell。一旦所有的命令都被执行,所有的子shell会中止,然后会返回到原始的父shell。Shell程序中的注释:推荐在shell程序中提供注释语句来注明程序的内容。

注释由一个#符号开始,Shell不会去执行任何在#之后的语句。#能够出现在命令行的任何位置。注意:你不可以给shell程序取名为test因为test是一个内部的shell命令。1.3 传递数据给shell程序$ color = lavender$ cat color1echo you are now running program: color1echo the value of the variable color is : $color$ chmod +x color1$ color1you ar now running program : color1the value of the variable color is :$ export color$ color1you are now running program : color1the value of the variable color is : lavender传递数据给shell脚本的一种方法就是通过环境。

在上例中,本地变量color被赋值为lavender,然后创建了shell程序color1;然后更改为可执行权限;然后这个shell程序被执行,color1脚本的意图是显示color变量的值,但是由于color是一个本地变量,属于父shell私有的,运行color1产生的子shell不能识别这个变量,因此不能打印出它的值,而当color被输出到环境中就可以被子shell读取。同样,由于shell进程不能够更改父进程的环境,对一个子进程中的环境变量重新赋值不会影响到父进程环境中的值。

如以下的shell脚本中的color2。echo The original value of the variable color is $colorech0 This program will set the value of color to ambercolor=amberecho The value of color is now $colorecho When your program concludes,display the value of the color variable观察在你设置了color的值后有什么变化。输出这个变量,然后执行color2:$ export color=lavender$ echo $colorlanvender$ color2The original value of the variable color is lavenderThe program will set the value of color to amberThe value of volor is now amberWhen your progam concludes, display the value of the color variable,$ echo $colorlanvender1.4 shell 程序的参数命令行:$ sh_program arg1 arg2 . . . argx$0 $1 $2 .... $X例子:$ cat color3echo you are now running program: $0echo The value of command line argument \#1 is: $1echo The value of command line argument \#2 is : $2$ chmod +x color3$ color3 red green You are now running program: color3The value of command line argument #1 is : redThe value of command line argument #2 is: green大多数的UNIX系统命令可以接收命令行参数,这些参数通常告诉命令它将要操作的文件或目录(cp f1 f2),另外指定的参数扩展命令的能力(ls –l),或者提供文本字符串(banner hi there)。命令行参数对shell程序同样有效,使用这种方式传送信息给你的程序十分方便。通过开发一个接收命令行参数的程序,你可以传递文件或者目录命令名给你的程序处理,就像你运行UNIX系统命令一样,你也可以定义命令行选项来让命令行使用shell程序额外的功能。

在shell程序中的命令行参数与参数在命令行的位置相关,这样的参数被称为位置参数,因为对每一个特殊变量的赋值依靠一这些参数在命令行中的位置,变量的变量名对应变量在命令行中的位置,因此这些特殊的变量名为数字0,1,2等,一直到最后的参数被传递,变量名的存取也通过同样的方法,在名字前面加上$ 符号,因此,为了存取你的shell程序中的命令行参数,你可以应用$0,$1,$2等等。在$9以后,必须使用括号:$(10),$(11),否则,shell会将$10看成是$1后面跟一个0。而$0会一直保存程序或命令的名字1.4 shell程序的参数(继续)以下的shell程序会安装一个程序,这个程序作为一个命令行参数被安装到你的bin目录:首先创建程序my_install,注意目录$HOME/bin应该预先存在。

$ cat > my_installecho $0 will install $1 to your bin directorychmod +x $1mv $1 $HOME/binecho Installation of $1 is completectrl + d$ chmod +x my_intalll$ my_install color3my_install will install color3 to your bin directoryInstallation of color3 is complete$这个例子中,程序指明第一个命令行参数为一个文件名,然后加上执行权限,然后移动到你当前目录下的bin目录下。记住UNIX系统的惯例是存贮程序在bin的目录下。

你也许想要在你的HOME目录下创建一个bin目录,在这个目录下你可以存储你的程序文件,记住要将你的bin目录放在PATH环境变量中,这样shell才会找到你的程序。

1.5 一些特殊shell变量- #和* # 

命令行参数的数量* 

完全的参数字符串例子:$ cat color4echo There are $#comand line argumentecho They are $*ehco The first command line argument is $1$ chmod +x color4$ color4 red green yellow blueThey are 4 command line argumentsThey are red green yellow blueThe first command line argument is red$至今为止我们看到的shell程序都不是很灵活,如color3需要输入两个正确的参数而my_install只需要一个。

通常在创建一个接收命令行参数的shell程序的时候,你想要用户输入一个参数的变量号码。你同时要程序执行成功,不管用户键入1个参数或是20个参数。当处理变量参数列表的时候,特殊shell变量会提供你许多的灵活性。通过$#你可以知道有多少参数已经被输入,通过$*可以存取全部的参数列表,而不管参数的数量。

请注意参数($0)不在$*这个参数列表里。每一个命令行参数都是互相独立的,你可以通过$*集中检索这些参数,也可以通过$1,$2,$3等等来独立的检索这些参数。1.5 一些特殊的shell变量-#和*(继续) 一个可以接收多个命令行参数的安装程序的例子: $ cat > my_install2echo $0 will install $# files to your bin directoryecho The files to be installed are : $*chmod +x $*mv $* $HOME/binecho Installaton is completectril + d$ chmod +x my_install2$ my_install2 color1 color2my_intall2 will install 2 files to your bin directoryThe files to be installed are: color1,color2Intallaiton is complete这个安装程序更加灵活,如果你有多个文件要安装,你仅需要执行这个程序一次,只要一次输入多个名字即可。非常重要的是:如果你计划传递整个参数的字符串给一个命令,这个命令必须能够接收多个参数。在以下的脚本中,用户提供一个目录名作为一个命令行参数。

程序会更改到指定的目录,显示当前的位置,并且列出内容。$ cat list_dir cd $*echo You are in the $(pwd) directoryecho The contents of the directory are:ls –F$ list_dir dir1 dir2 dir3sh: cd: bad argument count由于cd命令不能同时进入到多个目录中,这个程序执行会出错。1.6 shift 命令 向左移动所有的在*中的字符串n个位置 #的数目减少n个(n的默认值是1)

语法:shift [n]例子:$ cat color5orig_args=$*echo There are $# command line argumentsecho They are $*echo Shifting two argumentsshift 2echo There are $# comand line argumentsecho They are $*echo Shifting two argumentsshift 2; final_args=$*echo Original arguments are: $orig_argsecho Final arguments are: $final_argsshift命令会重新分配命令行参数对应位置参数,在shift n以后,所有的*中的参数会向左移动n个位置。同时$#会减n。默认的n为1。Shift命令不会影响到参数0的位置。一旦你完成一次移动,被移出命令行的参数会丢失。

如果你想在你的程序中引用这个参数,你需要在执行shift之前存贮这个参数到一个变量中。Shift命令可以用于:存取一组参数的位置,例如一系列的x,y的坐标 从命令行删除命令选项,假定选项在参数之前。

例子: $ color5 red green yellow orange blackThere are 6 command line argumentsThey are red green yellow blue orange blackShifting two argumentsThere are 4 command line argumentsThey are yellow blue orange blackShiftging two argumentsOriginal arguments are: red green yellow blue orange blackFinal argument are : orange black$1.7 read 命令语法:read variable [variable......]例子:$ cat color6echo This program prompts for user inputecho “please enter your favorite two colors -> \c”read color_a color_becho The colors you entered are: $color_b $color_a$ chmod +x color6$ color6This program prompts for user input Please enter your favorite two colors -> red blueThe colors you entered are: blue red$ color6This program prompts for user inputPlease enter you favorite two colors -> red blue tanThe color you enterd are :blue tan red如果使用命令行参数传递信息进程序,在命令执行之前用户必须知道正确的语法。

有一种情况,你想要在用户执行程序的时候提示他输入这些参数。read命令就是用来在程序执行的时候收集终端键入的信息。通常会使用echo命令来给用户一个提示,让他知道程序正在等待一些输入,同时通知用户应该输入的类型。因此,每一个read命令应该在echo命令后面。read命令会给出一个变量名的列表,用户在提示符下输入会给这些变量赋值(变量之间以空格分隔)。如果read命令定义的变量比输入的词要多,多出的变量会被赋空值。如果用户输入的词要比变量多,剩余的数据会赋给列表中的最后一个变量。一旦被赋值,你就可以象其他的shell变量一样存取这些变量。注意:不要混淆位置参数和变量read。位置参数在命令被激活时直接在命令行中使用,而read命令给变量赋值是在程序执行之中,用户响应输入的提示而给变量赋值。

1.7 read命令(继续)以下例子提示用户输入要被安装的文件名:$ cat > my_install3echo $0 will install files into your bin directoryecho “Enter the names of the files -> \c”read filenamesmv $filenames $HOME/binecho Instllation is completectrl + d$ chmod +x my_install13$ my_install13my_install13 will install files into your bin directoryEnter the names of the files -> f1 f2Installaton is complete这个安装脚本会提示用户输入需要chmod并移动到$HOME/bin的文件的文件名。这个程序给用户更多的关于应该输入数据情况的指引。而不像install2中用户必须在命令行中提供文件名,用户使用程序不需要特殊的语法,程序让用户确切地知道要输入什么。所有的输入的文件名都会被赋值给变量filenames。

1.8 另外的技术#号开始的文档为注释部分。 sh shell_program argumetnsshell_program 的属性可以不是可执行的。shell_program 必须是可读的。 sh –x shell_program arguments每一行在被执行前被打印出来。 在调试程序时有用处。 在shell程序中,#符号的意思是后面是一段注释,而shell会自动忽略#符号以后直到一个回车符号为止的所有字符。 执行一个shell程序的另外一种方法是:sh shell_program arguments这种方式激活一个子shell并且指定这个子shell为执行这个程序的命令解释器。这个程序文件的属性不一定必须为可执行。这种方式的用途在:你正在在一种shell下工作,同时想要执行用其他shell命令语言写的shell程序十分有用。你也可以在你的shell程序的第一行前加入! /usr/bin/ shell_name来指定命令行解释器,这样如果你当前正在POSIX shell下工作,但是想要执行一个C shell的脚本,你的C shell程序的第一行应该为:#!/usr/bin/csh虽然shell程序没有调试器,命令:sh –x shell_program arguments会在执行每一行时,先在屏幕上打印出shell程序的每一行。这允许你看到shell如何进行文件名产生,变量替代,和命令替代。这个选项对发现打字错误十分有帮助。

shell编程-shell编程-循环语句(1)

shell编程之循环语句(1)目标:完成这一章,你将能够作以下事情:使用while语句在条件为真的时候重复地执行一段代码。

使用until语句重复执行一段代码直到条件为真。 使用交互性的for语句进行循环控制。

1.循环的简单介绍目标: 

重复的执行一段命令列表。控制; 

基于一个关键命令的返回值。

三种格式: 

while ... do ... done

until ... do ... done

for ... do ... done循环语句让你可以重复执行一个命令列表,而决定是继续循环还是跳出循环是基于一个命令的返回值。

test命令常常被用来控制一个循环是否继续。与分支语句不同的是,在分支语句中开始一个分支语句的关键字和结束一个分支语句的关键字是相反的(if/fi 和case/esac),循环语句由一个关键字和一些条件开始,循环体整个用do/done来包围起来。2.使用let来进行算术计算语法:

let expression or (( expression ))

例子:

$ x=10

$ x=12$ y=2

$ let "x <10"

$ let x=x+2 

$ echo $?$ echo $x

112

$ (( x > 10 ))$ let "x = x / (y+1)" 

$ echo $?$ echo $x 

$ 04

$ if ((x > 10 ))$ (( x = x + 1 ))> then echo x greater$ echo $x> else echo x not greater5 fi

x greater循环语句通常使用一个增长的数字变量来进行控制。

使用let命令,可以在shell脚本中使用算术表达式。这个命令允许使用长的整数运算。在上例中,expression代表一个shell

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有