370 likes | 553 Views
Linux 下 Shell 编程简介. 刘桂海 ( 西安理工大学 计算机科学与工程学院,陕西 西安 710048 ). Linuxidc.com. Linux 公社( LinuxIDC.com )于 2006 年 9 月 25 日注册并开通网站, Linux 现在已经成为一种广受关注和支持的一种操作系统, IDC 是互联网数据中心, LinuxIDC 就是关于 Linux 的数据中心。 LinuxIDC.com 提供包括 Ubuntu , Fedora , SUSE 技术,以及最新 IT 资讯等 Linux 专业类网站。. 内容安排. 综述篇 命令篇 变量篇
E N D
Linux下Shell编程简介 刘桂海 ( 西安理工大学 计算机科学与工程学院,陕西 西安 710048)
Linuxidc.com 西安理工大学计算机科学与工程学院 Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。 LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。
内容安排 • 综述篇 • 命令篇 • 变量篇 • 条件测试篇 • 控制结构篇 • 函数篇 西安理工大学计算机科学与工程学院
综述篇 • Shell是什么 • 怎样写Shell • Cygwin简介 • Linux黑洞 西安理工大学计算机科学与工程学院
综述篇——Shell是什么 • 壳(Shell)保护其内部的核(Kernel) 西安理工大学计算机科学与工程学院
综述篇——Shell是什么 • Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/Linux 操作系统之核心程序(kernel)间的一个接口。 • 为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳(shell)。用户向shell提出请求,shell解释并将请求传给内核。 • 使用较广的shell有标准的Bourne shell (sh)、Korn Shell(ksh)、C shell (csh)、Bourne Again Shell(bash)等。 • 查看当前环境所用shell:echo $SHELL • shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。 • 本质上,shell 脚本是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令,然后调用相应的应用程序。 西安理工大学计算机科学与工程学院
综述篇——怎样写Shell 简单脚本示例: vi ShowHello.sh 以下为脚本内容: #!/bin/sh #ShowHello.sh #To show hello to somebody echo -n“Enter Your Name:” read NAME echo “Hello,$NAME!” 保存,退出vi编辑器。 为脚本添加可执行权限: chmod u+x ShowHello.sh 运行脚本:ShowHello.sh • 利用vi编辑器编辑脚本,将脚本命名为脚本功能.sh • Shell脚本不是复杂的程序,它是按行解释的,脚本第一行总是以 #!/bin/sh开头,它通知系统以下的Shell程序使用系统上的Bourne Shell来解释。 • 第二行注释中写入脚本名,第三行注释开始写入脚本功能——习惯。 • 以下行进入脚本正式编写 • 编写完后给脚本添加执行权限: chmod u+x ScripName • 运行脚本:ScripName 或 ./ScripName 西安理工大学计算机科学与工程学院
综述篇——cygwin简介 • cygwin——在windows下开发linux程序! cygwin是一个在windows平台上运行的linux模拟环境,是cygnus solutions公司开发的自由软件。它把gcc、gdb、gas等开发工具进行了改进,使它们能够生成并解释win32的目标文件,开发者基于win32api写了一个unix系统库的模拟层 ,只要把这些工具的源代码和这个共享库(cygwin dll )连接到一起,就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集 。 软件下载:cygwin的官方网站:www.cygwin.com 推荐下载:http://www.macraigor.com/full_gnu.htm 软件安装:在安装的过程中可选择默认安装路径:c:\cygwin 安装完后要修改cygwin目录下的cygwin.bat文件,在@echo off 后面加上set CYGWIN=title ntea,这是因为Cygwin的启动批处理 文件需要启动Unix文件系统模拟。 西安理工大学计算机科学与工程学院
综述篇——Linux黑洞 • /dev/null 是一个虚设的设备,俗称“Linux黑洞”,任何对/dev/null的写入都会成功,但数据会消失得无影无踪,没有任何反馈。所以经常把不想在屏幕显示的信息全部送到/dev/null中,在shell脚本中用得比较多。 如:ls –l > /dev/null • 还可以用来清空文件的内容:cat /dev/null > FileName 西安理工大学计算机科学与工程学院
Linuxidc.com 西安理工大学计算机科学与工程学院 Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。 LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。
命令篇 • 用户管理 • 目录管理 • 文件管理 • 权限管理 西安理工大学计算机科学与工程学院
命令篇——用户管理 • 新建用户(user add) useradd UserName 新建用户后,会在/home目录下建立一个以UserName命名的文件夹,用户每次登录时自动定位到该文件夹下。 • 为用户添加密码(password) passwd UserName • 删除用户(userdelete) userdel UserName 使用–p选项可以删除用户目录下的文件及与用户相关联的其他文件。 • 新建组群(group add) groupadd GroupName • 删除组群(groupdelete) groupdel GroupName 西安理工大学计算机科学与工程学院
命令篇——用户管理 • 用户身份 whoami • 查看登录用户 who[选项] -a 显示所有用户的所有信息 -H显示列标题 • 查看用户的操作 w 某一时刻用户的行为 • 用户间切换(substitute user) su UserName 如:su或su root切换为根用户 su Haison切换为名为Haison的用户 西安理工大学计算机科学与工程学院
命令篇——目录管理 • 创建目录(make directory) mkdir DirecName • 删除目录(remove directory) rmdir DirecName • 显示工作目录(print working directory) pwd • 显示目录内容(list) ls [选项] 选项:-a 显示当前目录下的所有文件,包括以.开头的文件。 -l 以长列表的形式显示文件列表,如: -rw-r--r-- 1 haison haison 18 Nov 2 10:10 haison.c 西安理工大学计算机科学与工程学院
命令篇——目录管理 • 改变当前目录(change directory) cd或 cd ~进入登录时的主目录 cd /进入根目录 cd ..进入上一级目录 cd /home进入系统的home目录 cd home进入当前目录下的home目录 • 目录重命名(move) mv SourceDirecName TargetDirecName • 目录拷贝(copy) cp SourceDirec TargetDirec -r 拷贝目录下的文件、子目录及子目录下的文件 西安理工大学计算机科学与工程学院
命令篇——文件管理 • 新建文件 >FileName或touch FileName或vi FileName • 删除文件(remove file) rm [选项] FileName 选项:-i系统提示是否真要删除该文件 -f删除文件之前不提示任何确认信息 -r递归删除目录下所有子目录的内容 • 文件拷贝(copy) cp SourceFile TargetFile • 文件链接(link) ln –s SourceFile TargetFile 创建文件链接,用ls –l查看,会看到TargetFile->SourceFile 西安理工大学计算机科学与工程学院
命令篇——文件管理 • 显示文件内容 moreFileName 一次一屏的显示文件内容,空格或回车显示下一屏 less FileName 一次一屏的显示文件内容,空格或回车显示下一屏 cat FileName 一次全部显示文件的内容 cat file1 file2>file3 将file1、file2的内容写到file3,覆盖file3原内容 cat file1>>file2 将file1的内容追加到file2,file2原内容不变 head FileName 只显示文件的前10行 head –n FileName 显示文件的前n行 tail FileName 只显示文件的后10行 tail –n FileName 显示文件的后n行 nl FileName 以编号的形式一次全部显示文件的内容,忽略空格 西安理工大学计算机科学与工程学院
Linuxidc.com 西安理工大学计算机科学与工程学院 Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。 LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。
命令篇——文件管理 • 文件移动/重命名(move) mv SourceFile TargetFile将一个或多个文件移动到另外一个目录下,或者将一个文件重命名为另一个文件。 • 文件查找(find) find [路径] [选项] 如:find / -name “Linux” -print • 文件内容查找(grep) 如:grep “main” haison.c • 文件类型 命令ls –l以长列表形式显示文件的类型等,如:-rw-r--r-- 西安理工大学计算机科学与工程学院
u:user,文件的属主 g:group,文件的属主所在的组,属组 o:other,其他的用户 类型 u g o a:all,以上三种人 命令篇——权限管理 • 文件访问权限 一个文件一经创建,就具有三种访问方式 一个文件由1个类型和9个权限位来描述,9个权限位分为3组,每组3个权限位,具体表示如下所示: 西安理工大学计算机科学与工程学院
命令篇——权限管理 • 改变文件/目录的权限(change mode) chmod [u/g/o/a] [+/-/=] [权限] FileName/DirecName 其中:+:增加指定的权限 -:去掉指定的权限 =:清除所选的权限并将其设置为制定的权限 chmod允许使用八进制符号作为模式,改变权限。 chmod PermissionCode FileName/DirecName 其中,PermissionCode 按如下方式计算 4+2+1=7 4+2=6 4+1=5 所以该文件/目录具有的权限为:765 西安理工大学计算机科学与工程学院
命令篇——权限管理 chmod命令示例 假定haison.c最初具有这样的权限rwxrwxrwx,连续操作如下 西安理工大学计算机科学与工程学院
命令篇——权限管理 -rw-r--r-- 1 haison haison 18 Nov 2 10:10 haison.c • 改变文件/目录的属主(change owner) chown Owner FileName/DirecName 如:chown Dave haison.c • 改变文件/目录的属组(change group) chgrp Group FileName/DirecName 如:chgrp Dave haison.c • 改变文件/目录的属主和属组 chown owner:group FileName/DirecName 如:chown Dave:Dave haison.c 西安理工大学计算机科学与工程学院
变量篇 • 变量可以定制用户本身的工作环境,使用变量可以保存有用信息,使系统获知用户相关设置,也用于保存暂时信息。 • 变量一般都用大写字母表示 • 使用echo命令可以显示单个变量的取值,要在变量名前面加$ 如:USER=“haison” echo $USER • 如果设置变量时,不想再改变其值,可以将其设置为只读,只要在变量名前加readonly • 使用set命令可以显示所有本地定义的shell变量 • 使用unset 变量名可以清除对变量的定义 西安理工大学计算机科学与工程学院
本地变量:用户自定义的变量。 环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。 位置变量:$0(脚本名),$1-$9:脚本参数。 特定变量:脚本运行时的一些相关信息。 变量篇 西安理工大学计算机科学与工程学院
变量篇 • 示例: #!/bin/sh #VarTest.sh #To test the variables USER=haison echo "Hello,$USER,the output of this script are as follows:" echo "The script name is :`basename $0`" echo "The first param of the script is :$1" echo "The second param of the script is :$2" echo "The tenth param of the script is :$10" echo "All the params you input are :$*" echo "The number of the params you input are:$#" echo "The process ID for this script is :$$" echo "The exit status of this script is :$?" 西安理工大学计算机科学与工程学院
条件测试篇 • 文件状态测试 • 示例: [ -s haison.c ] 0表示成功,其他为失败,下同。 • 逻辑操作符 -a逻辑与(and),操作符两边均为真,结果为真,否则为假。 -o逻辑或(or),操作符两边一边为真,结果为真,否则为假。 ! 逻辑否,条件为假,结果为真,反之。 • 示例: [ -r haison.c –a –w hai.c ] 西安理工大学计算机科学与工程学院
条件测试篇 • 字符串测试 • 示例:[ -z $SHELL ] • 数值测试 • 示例:[ “10” -eq “12” ] 西安理工大学计算机科学与工程学院
if语句: if then else提供条件测试 case 语句:允许匹配模式、单词或值 选择结构 for:每次依次处理列表内的信息,直至循环耗尽。 until:不常用。条件在循环末尾,至少执行一次。 while:条件在循环头部。 循环结构 控制结构篇 西安理工大学计算机科学与工程学院
控制结构篇——if语句 • 示例 #!/bin/sh #ifTest #to show the method of if echo -e "Enter the first integer:\c" read FIRST echo -n "Enter the second integer:" read SECOND if [ "$FIRST" -gt "$SECOND" ] then echo "$FIRST is greater than $SECOND" elif [ "$FIRST" -gt "$SECOND" ] then echo "$FIRST is less than $SECOND" else echo "$FIRST is equal to $SECOND" fi • 格式2 if [ 条件] ;then命令 fi • 格式1 if [ 条件] then 命令 fi 或 • 格式4 if [ 条件1 ] then 命令1 elif[ 条件2 ] then 命令2 else 命令3 fi • 格式3 if [ 条件] then 命令1 else 命令2 fi 西安理工大学计算机科学与工程学院
控制结构篇——case语句 • 格式 case 值 in 模式1) 命令1 ;; …… *) 命令n ;; esac 取值后面必须为单词in,每一个模式必须以右括号 结束。取值可以为变量或常数。取值检测匹配的 每一个模式,一旦模式匹配,其间所有命令开始 执行直至;;。执行完匹配模式相应命令后不再继 续其他模式。如果无一匹配模式,使用*号捕获 该值,再接受其他输入。 • 示例 • #!/bin/sh • #caseTest • #to test the method of case • USER=`whoami` • case $USER in • root)echo “You can do all the operations” • ;; • Dave)echo "You can do some operations” • ;; • *)echo "Sorry,you can not do anything" • ;; • esac 西安理工大学计算机科学与工程学院
控制结构篇——for循环 • 格式 for 变量名 in列表 do 命令 done 当变量值在列表里,for循环即执行 一次所有命令,使用变量名访问列 表中取值。 嵌套循环可以将一个for循环嵌在 另一个for循环里 • 示例 #!/bin/sh #forTest #to test the method of for COUNTER=0 for FILES in * do COUNTER=`expr $COUNTER + 1` done echo "There are $COUNTER files in `pwd` " 西安理工大学计算机科学与工程学院
控制结构篇——until循环 • 格式 until 条件 do 命令 done until 执行一系列命令,直至条件为真 时停止 • 示例 • #!/bin/sh • #untilTest • #to test the mothod of until • IS_ROOT=`who|grep root` • until [ "IS_ROOT" ] • do • IS_ROOT=`who|grep root` • sleep 5 • done • echo "Watch it.root in!" 西安理工大学计算机科学与工程学院
控制结构篇——while循环 • 格式 while 命令 do 命令 done While循环用于不断执行一系列命令, 也用于从输入文件中读取数据。虽然 通常只有一个命令,但在while和do之 间可以放几个命令。命令通常用作测 试条件,只有当命令的退出状态为0 时,do和done之间命令才被执行,如 果退出状态不是0,则循环终止。 • 示例 • #!/bin/sh • #whileTest • #to test the method of while • COUNTER=0 • while [ $COUNTER -lt 10 ] • do • echo $COUNTER • COUNTER=`expr $COUNTER + 1` • done • while read LINE • do • echo $LINE • done < names.txt 西安理工大学计算机科学与工程学院
函数篇 • 示例1 • #!/bin/sh • #funTest • #to test the function • DATE=`date` • Hello() • { • echo “Hello,today is $DATE” • } • Hello • 格式 函数名 () { 命令 } 所有函数在使用前必须定义,这意味着必 须将函数放在脚本开始部分,直至shell解释 器首次发现它,才可以使用。 调用函数仅使用其函数名即可,要传给函 数的变量跟在函数后面。 函数里面定义的变量以下划线(_)开始。 函数可以放在同一个文件中作为一段代 码,也可以放在只包含函数的单独文件中,文 件也必须以#!/bin/sh开头。 • 示例2 • #!/bin/sh • #funTest • #to test the function • . ./Hello • Hello 西安理工大学计算机科学与工程学院
Linuxidc.com 西安理工大学计算机科学与工程学院 Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。 LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。