您的当前位置:首页正文

shell程序设计(通信)1

来源:个人技术集锦
Shell程序设计 本章的学习目标

    

了解shell的地位和作用

熟练掌握shell脚本的建立与执行方法 掌握shell的变量及特殊字符 掌握shell的输入输出命令 掌握shell程序逻辑结构语句

主要内容

 Shell概述  Shell的变量

 Shell中的特殊字符

 Shell编辑中的输入输出命令  Shell结构控制语句

Shell简介

1、Shell的功能(1)作为命令解释程序

(2)作为一种高级程序设计语言 shell是一种命令行解释程序,它提供了用户与操作系统之间基于命令行的交互界面。用户命令行输入命令,由SHELL对它们做出解释,并将其送往操作系统去执行。然而,它不仅仅是一种交互式语言,它还是一种可编程的程序设计语言。将若干个shell命令写入一个文件就构成了一个shell程序,它可以被shell逐条的解释执行。

Shell简介

shell程序可以使用各种变量、参数和控制结构来组织命令流程,自动化的完成各种复杂冗繁的处理工作。

shell是基于字符串的语言:只做字符串处理,不支持复杂的数据结构和运算。Shell输出也全部是字符方式。

2、Shell的主要版本:sh csh ksh

在linux系统中流行的使用的shell主流是Bash,它是Bourne Again Shell的缩写,bash是由bourne shell发展而来的,但是它包含了csh和ksh的特性。 shell脚本的建立与执行  shell脚本的建立

 Shell脚本是文本文件,可以用任何文本编辑器建立和编辑脚本,shell脚本文件

的名称没有限定的扩展名,通常不带扩展名或带“.sh”扩展名。

 ①vi shell脚本名  ②cat >文件名  。。。。。 Ctrl+d

例9.1 第1个Shell程序: $ cat hello #hello程序 # This is a shell script to say hello. echo Hello World!

echo -n “Today is ”

date “+%A, %B %d, %Y.” $ . hello #运行hello程序 Hello World!

Today is Saturday, October 13, 2015. $

这个hello程序的第1行是注释,后面3行是命令。在执行此程序时,Shell依次执行这3个命令并输出显示信息。

shell脚本的建立与执行

 shell脚本的执行方式主要有3种  (1) 将脚本作为可执行文件执行:

$ chmod a+x hello $ ./hello

用文本编辑器生成的脚本文件默认是没有x权限的,也就是说是不可直接执行的。赋予x权限后,脚本就可以像一般的Shell命令那样执行了。如果脚本不在系统存放命令的标准目录下,需要在执行时指定脚本的路径。上例中脚本hello放在当前目录下,所以要用./hello来运行。 shell脚本的建立与执行

(2) 启动一个Shell子进程来执行脚本文件: $ sh hello #或sh < hello

执行此命令行时,Shell进程先启动一个bash子进程,让它执行hello脚本的内容,执行完毕后bash子进程也终止。在这种方式中,脚本是作为命令参数传给子Shell的。子Shell运行时读取该文件并执行其内容,因此脚本文件不必有执行权限。

shell脚本的建立与执行

(3) 让当前Shell进程执行脚本文件:

$ . hello #注意.后面的空格

“.”是一个Shell内部命令,hello是它的参数。“.”命令的功能是读取参数指定的文件,执行其内容。这种执行方式与第2种方式类似,区别在于此方式是由当前Shell进程来执行脚本文件的。 shell的变量

 Shell是基于字符串的编程语言,shell的变量只能存储字符串。  Shell的变量有两种类型,即shell环境变量和用户自定义变量。

 Shell的环境变量:作用是定制shell的运行环境,保证shell正确执行,它又分为可

写和只读两大类。

 1、可写的shell环境变量

可写的shell环境变量可以对它们进行赋值,大部分可写的shell环境变量都在登录过程中执行“/etc/profile”文件时进行初始化。该文件由系统管理员设置,用于为系统上的所有用户建立一个公共环境。

部分重要的可写环境变量

CDPATH: 包含一系列目录名;如果该变量未设置,cd命令将搜索当前目录。 ENV:UNIX/ linux查找配置文件的路径 HOME:用户初次登录时的起始目录

PATH:包含了用户的搜索路径的变量,也即shell用来搜索外部命令或者程序的目录。 PS1:在命令行上出现的shell提示符。

PS2:如果shell认为一个命令尚未结束,例如当命令以作为转义字符的反斜杠终止时,则在命令的第二行显示第2个shell提示符 PWD:当前工作目录的名称 TREM:用户控制终端的类型

PPID:父进程的进程ID号  2、只读的shell环境变量

只读的shell环境变量的变量名和值有shell自动设置。用户能使用和读取它们的值,但不能对它们进行更改,只读的shell环境变量有两种:一种是特殊的环境变量;另一种是位置参数。

特殊的环境变量

 $@所有参数字符串组成的字符串  $0 shell程序名

 $1-$9第一至第9个命令行参数的值  $#命令行参数的个数

 $$当前进程的进程ID(PID)

 $?最后执行的一条命令的退出状态,返回值为0则成功,非0则失败  $!在后台运行的最后一个进程的进程ID 位置参数

 在命令行传递给shell脚本的参数。  共有十个位置参数,依次是

 $0,$1,$2,…,$9

 必有$0;而其他位置参数依据实际需求,可有可无。  输出位置参数

 可以用echo命令输出位置参数 [root@localhost ~]# cat var_test

echo My name is $0, I have $# parameters, they are $@ echo The first of them is \\“$1\\” 字符串测试

参数 str str1 = str2 str1 ! = str2 -n str -z str 功能 如果字符串str不是空字符串,则测试条件为真 如果strl等于str 2,则测试条件为真(注意,“=”前后须有空格) 如果str1不等于str2,则测试条件为真 如果字符串str的长度不为0,则测试条件为真 如果字符串str的长度为O,则测试条件为真 例如:

 (1)判断两个变量S1与S2字符串是否相等,可以写成[“$S1” = “$S2”]或者

test “$S1” = “$S2”

 (2)在引用变量及字符串中,要求用双引号括起来,如判断变量S1是否等于字符

串“yes”可以写成:

[“$S1” = “yes”]或者test “$S1 = “yes” 幻灯片52

数值测试 参数 n1 –eq n2 功能 如果整数n1等于n2(n1 = n2),则测试条件为真 n1 –ne n2 n1 –lt n2 n1 –le n2 n1 –gt n2 n1 –ge n2 如果整数nl不等于n2(n1 <> n2),则测试条件为真 如果n1小于n2(n1 < n2),则测试条件为真 如果n1小于等于n2(n1 <= n2),则测试条件为真 如果n1大于n2(n1 > n2),则测试条件为真 如果nl大于等于n2(n1 >= n2),则测试条件为真

幻灯片53

用逻辑操作符进行组合的测试语句

参数 ! -a -o ( ) 功能 逻辑非,放在任意逻辑表达式之前,原来真的表达式变为假,原来假的变为真 逻辑与,放在两个逻辑表达式之间,仅当两个逻辑表达式都为真时,结果才为真 逻辑或,放在两个逻辑表达式之间,其中只要有一个逻辑表达式为真时,结果就为真 圆括号,用于将表达式分组,优先得到结果。括号前后应有空格并用转义符“\\(”和“\\)” 用逻辑操作符进行组合的测试语句实例

 [ ! \"$s1\" -le 0 ]

 ! test \"$s1\" -le 0  [ -f \"$s1\" –a –w \"$s1\" ]

 test –f \"$s1\" -a –w \"$s1\"  [ \"$s1\" –gt 0 –o \"$s2\" –lt 10 ]

 test \"$s1\" –gt 0 –o \"$s2\" –lt 10

 [ \\( \"$a\" –gt 0 –a \"$a\" –lt 10 \\) –a \"$a\" –ne 5 ] test \\( \"$a\" –gt 0 –a \"$a\" –lt 10 \\) –a \"$a\" –ne 5

算术表达式和退出脚本程序命令

 五种基本的算术运算:+(加)、-(减)、\*(乘)、/(除)和%(取模)。shell只

提供整数的运算。格式如下:  expr n1 运算符 n2

 例:expr 15 \\* 15  注意:在运算符的前后都留有空格,否则expr不对表达式进行计算,而直接输出它们。  退出脚本程序命令exit case语句

 对同一变量进行多次的测试,比elif语句更简单、简洁

 case string1 in  str1)

 commands-list1;;  str2)

 commands-list2;;

 ...  strn)

 commands-listn;;  esac

例7.10用case语句来判断输入的位置参数所携带的字符串是否匹配一个文件名的字符串。 #cat test7-10 case $1 in

file) echo “it is a file”;;

dir) echo “current directory is `pwd`” ls –l;;

*) echo “it is not a filename”;; esca

使用case语句时应注意以下几点

 (1) 每个正则表达式后面可有一条或多条命令,其最后一条命令必须以两个分号(;;)

结束。

 (2) 正则表达式中可以使用通配符。

 (3) 如果一个正则表达式是由多个模式组成,那么各模式之间应以竖线“|”隔开。表

示各模式是“或”关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。

使用case语句时应注意以下几点

 (4) 各正则表达式是唯一的,不应重复出现。

 (5) case语句以关键字case开头,以关键字esac结束。

 (6) case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行

任何命令,则退出值为零。

例7.11case语句的通配符几多个模式组合实例 #cat test 7-11 case $1 in

[dD]ate) echo “the date is `date`”;;

dir|path) echo “cuurent directory is `pwd`;; *) echo “bad argument”;; esac

for语句

 for命令常用于简单的、确定的循环处理  格式:

 for variable [in argument-list]  do

 command-list  done

 作用:重复执行command-list中的命令,执行次数与in argument-list中的单词个

数相同。其中的[in argument-list]部分为可选项,由于它的不同又可有三种形式。 [in argument-list]部分三种形式  [argument-list]为字符串列表

 变量variable依次取字符串列表中各字符串 ,对每次取的值都执行命令列表,

知道所有字符串都处理完。

 例7-12将指定的人名用for循环依次输出。  #cat test7-12

 for people in Debbie Tom John Kitty Kuhn  do

 echo “$people”  done

[in argument-list]部分三种形式  [argument-list]为文件的表达式

 变量的值依次取当前目录(或指定目录)下与文件表达式相匹配的文件名,每取

值一次,就进入循环体执行命令表,直到所有匹配的文件名取完为止。

 例7-13将当前目录下的所有*.c文件用for循环依次输出。

 #cat test7-13  for i in *.c

 do  cat $i

 done

[in argument-list]部分三种形式

 [argument-list]为空

 [argument-list]也可以用$@来代替,即for i等同于for i in “$@” 。变量

依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。

例7-14编写shell脚本,第一个位置参数为指定的目录,其后指定的位置参数为第一个位置参数指定目录下的文件,显示这些文件的内容 #cat test7-14 dir=$1;shift

if [ -d $dir ] then cd $dir for name do

if [ -f $name ] then cat $name

echo “End of ${dir}/$name”

else echo “Invalid file name:${dir}/$name fi done

else echo “Bad of directory name:$dir” fi

while语句

 while命令的作用的是进行有条件的循环控制  格式为:

 while expression  do

 command-list  done

 作用:只要expression的值为真,则进入循环体,执行command-1ist中的命令,然

后再做条件测试,直到测试条件为假时才终止while语句的行。

例7-15编写程序,这段程序对各个给定的位置参数,首先判断其是否是普通文件,若是,则显示其内容;否则,显示它不是文件名的信息。每次循环处理一个位置参数$1,利用shift命令可把后续位置参数左移。 #cat test7-15 while [ $1 ] do

if [ -f $1 ]

then echo “display: $1 ” cat $1

else echo “$1 is not a file name. ” fi shift done

幻灯片68

例7-16利用while循环输出1-10之间的整数。 #cat test7-16 x=1

while [ $x -le 10 ] do

echo $x

x=`expr $x + 1` done

until语句

 格式为:

 until expression  do

 command-list  done

 作用: 只要expression的值为假,就执行command—lists的命令。 例7-17 用until完成与例7-16相同的任务。 #cat test7-17 x=1

until [ $x –gt 10 ] do

echo $x

x=`expr $x + 1` done

break和continue语句

 break命令可以从循环体中退出来。格式为:

 break

 continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。

格式为:

 continue

例7-18利用while和break完成例7-16等的任务 #cat test7-18 x=1

while true do

echo $x

x=`expr $x + 1` if [ “$x” –gt 10 ] then break fi done

例7-19输入一组数,打印除了值为3的所有数。 #cat test7-19

for I in 1 2 3 4 5 6 do

if [ “$i” –eq 3 ] then continue else echo “$i” fi done

 1.编写一个shell脚本,将用户主目录下的所有*.txt文件用for循环复制到mysoft

子目录下并显示所复制文件的内容。

 2.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。

 3、编写一个shell脚本,从键盘输入两个整数,比较其大小,并将其中较大的一个输

出。

 4、设计一个模拟台式计算器,从键盘输入两个数,再输入算术运算符,求其计算结果。

要求输出结果为:第一个数 运算符 第二个数 = 运算结果。(运算符仅包含expr支持的+ - * / %) GCC简介

 Linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编

译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 gcc的执行过程

Gcc编译的全过程要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。  gcc的命令格式:

 gcc [选项] 文件列表

文件列表参数指定了gcc的输入文件,选项用于定制gcc的行为。 幻灯片78

 gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这

里只介绍其中最基本、最常用的参数。

 -c,预处理+编译+汇编,产生目标代码,不连接。

 -o output_filename,指定输出文件的名称为output_filename,同时这个名称

不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。  -E 预处理,产生预处理过的代码,不编译。  -S 预处理+编译,产生汇编代码,不汇编。

错误!未找到引用源。

因篇幅问题不能全部显示,请点此查看更多更全内容