- 1. Linux下Shell编程简介刘桂海
( 西安理工大学 计算机科学与工程学院,陕西 西安 710048)
- 2. 内容安排综述篇
命令篇
变量篇
条件测试篇
控制结构篇
函数篇10/21/2018西安理工大学计算机科学与工程学院
- 3. 综述篇Shell是什么
怎样写Shell
Cygwin简介
Linux黑洞10/21/2018西安理工大学计算机科学与工程学院
- 4. 综述篇——Shell是什么壳(Shell)保护其内部的核(Kernel) 10/21/2018西安理工大学计算机科学与工程学院
- 5. 综述篇——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。它接收用户命令,然后调用相应的应用程序。10/21/2018西安理工大学计算机科学与工程学院
- 6. 综述篇——怎样写Shell利用vi编辑器编辑脚本,将脚本命名为脚本功能.sh
Shell脚本不是复杂的程序,它是按行解释的,脚本第一行总是以 #!/bin/sh 开头,它通知系统以下的Shell程序使用系统上的Bourne Shell来解释。
第二行注释中写入脚本名,第三行注释开始写入脚本功能——习惯。
以下行进入脚本正式编写
编写完后给脚本添加执行权限:
chmod u+x ScripName
运行脚本:ScripName
或 ./ScripName简单脚本示例:
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.sh10/21/2018西安理工大学计算机科学与工程学院
- 7. 综述篇——cygwin简介cygwin——在windows下开发linux程序!
cygwin是一个在windows平台上运行的linux模拟环境,是cygnus solutions公司开发的自由软件。它把gcc、gdb、gas等开发工具进行了改进,使它们能够生成并解释win32的目标文件,开发者基于win32 api写了一个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文件系统模拟。10/21/2018西安理工大学计算机科学与工程学院
- 8. 综述篇——Linux黑洞/dev/null
是一个虚设的设备,俗称“Linux黑洞”,任何对/dev/null的写入都会成功,但数据会消失得无影无踪,没有任何反馈。所以经常把不想在屏幕显示的信息全部送到/dev/null中,在shell脚本中用得比较多。
如:ls –l > /dev/null
还可以用来清空文件的内容:cat /dev/null > FileName
10/21/2018西安理工大学计算机科学与工程学院
- 9. 命令篇用户管理
目录管理
文件管理
权限管理10/21/2018西安理工大学计算机科学与工程学院
- 10. 命令篇——用户管理新建用户(user add)
useradd UserName
新建用户后,会在/home目录下建立一个以UserName命名的文件夹,用户每次登录时自动定位到该文件夹下。
为用户添加密码(password)
passwd UserName
删除用户(user delete)
userdel UserName
使用–p选项可以删除用户目录下的文件及与用户相关联的其他文件。
新建组群(group add)
groupadd GroupName
删除组群(group delete)
groupdel GroupName10/21/2018西安理工大学计算机科学与工程学院
- 11. 命令篇——用户管理用户身份
whoami
查看登录用户
who [选项]
-a 显示所有用户的所有信息
-H 显示列标题
查看用户的操作
w 某一时刻用户的行为
用户间切换(substitute user)
su UserName 如:su 或su root 切换为根用户
su Haison 切换为名为Haison的用户10/21/2018西安理工大学计算机科学与工程学院
- 12. 命令篇——目录管理创建目录(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
10/21/2018西安理工大学计算机科学与工程学院
- 13. 命令篇——目录管理改变当前目录(change directory)
cd 或 cd ~ 进入登录时的主目录
cd / 进入根目录
cd .. 进入上一级目录
cd /home 进入系统的home目录
cd home 进入当前目录下的home目录
目录重命名(move)
mv SourceDirecName TargetDirecName
目录拷贝(copy)
cp SourceDirec TargetDirec
-r 拷贝目录下的文件、子目录及子目录下的文件
10/21/2018西安理工大学计算机科学与工程学院
- 14. 命令篇——文件管理新建文件
>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
10/21/2018西安理工大学计算机科学与工程学院
- 15. 命令篇——文件管理显示文件内容
more FileName 一次一屏的显示文件内容,空格或回车显示下一屏
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 以编号的形式一次全部显示文件的内容,忽略空格10/21/2018西安理工大学计算机科学与工程学院
- 16. 命令篇——文件管理文件移动/重命名(move)
mv SourceFile TargetFile 将一个或多个文件移动到另外一个目录下,或者将一个文件重命名为另一个文件。
文件查找(find)
find [路径] [选项]
如:find / -name “Linux” -print
文件内容查找(grep)
如:grep “main” haison.c
文件类型
命令ls –l以长列表形式显示文件的类型等,如:-rw-r--r--前缀类型前缀类型—普通文件l链接(link)文件b块(block)设备文件p命名管道(pipe)文件c字符(character)设备文件s本地套接口(socket)d目录(directory)10/21/2018西安理工大学计算机科学与工程学院
- 17. 命令篇——权限管理文件访问权限
一个文件一经创建,就具有三种访问方式 字符含义八进制表示rread :读,可以显示该文件的内容22=4wwrite :写,可以编辑或删除它21=2xexcute:执行,如果是程序的话20=1-rwxrw-r-xugo类型 一个文件由1个类型和9个权限位来描述,9个权限位分为3组,每组3个权限位,具体表示如下所示:u:user,文件的属主g:group,文件的属主所在的组,属组o:other,其他的用户a:all,以上三种人10/21/2018西安理工大学计算机科学与工程学院
- 18. 命令篇——权限管理改变文件/目录的权限(change mode)
chmod [u/g/o/a] [+/-/=] [权限] FileName/DirecName
其中:+:增加指定的权限
-:去掉指定的权限
=:清除所选的权限并将其设置为制定的权限
chmod允许使用八进制符号作为模式,改变权限。
chmod PermissionCode FileName/DirecName
其中, PermissionCode 按如下方式计算-rwxrw-r-x4+2+1=74+2=64+1=5所以该文件/目录具有的权限为:76510/21/2018西安理工大学计算机科学与工程学院
- 19. 命令篇——权限管理命令结果含义chmod a-x haison.crw-rw-rw-收回所有用户的执行权限chmod go-w haison.crw-r- -r- -收回同组用户和其他用户的写权限chmod g+w haison.crw-rw-r- -赋予同组用户写权限chmod a= haison.c- - - - - - - - - 清除文件的所有权限chmod命令示例
假定haison.c最初具有这样的权限rwxrwxrwx,连续操作如下命令结果含义chmod 666 haison.crw-rw-rw-赋予所有用户读和写的权限chmod 644 haison.crw-r- - r- - 赋予属主读、写权限,其他用户读权限chmod 700 haison.crwx- - - - - - 赋予属主读、写和执行权限chmod 660 haison.crw-rw- - - -赋予属主、属组读和写的权限10/21/2018西安理工大学计算机科学与工程学院
- 20. 命令篇——权限管理 -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.c10/21/2018西安理工大学计算机科学与工程学院
- 21. 变量篇变量可以定制用户本身的工作环境,使用变量可以保存有用信息,使系统获知用户相关设置,也用于保存暂时信息。
变量一般都用大写字母表示
使用 echo命令可以显示单个变量的取值,要在变量名前面加$
如:USER=“haison”
echo $USER
如果设置变量时,不想再改变其值,可以将其设置为只读,只要在变量名前加readonly
使用set命令可以显示所有本地定义的shell变量
使用unset 变量名可以清除对变量的定义10/21/2018西安理工大学计算机科学与工程学院
- 22. 变量篇本地变量:用户自定义的变量。
环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。
位置变量:$0(脚本名),$1-$9:脚本参数。
特定变量:脚本运行时的一些相关信息。
$#传递到脚本的参数个数$*传递到脚本的参数,与位置变量不同,此选项参数可超过9个$$脚本运行时当前进程的ID号,常用作临时变量的后缀,如haison.$$$!后台运行的(&)最后一个进程的ID号$@与$#相同,使用时加引号,并在引号中返回参数个数$-上一个命令的最后一个参数$?最后命令的退出状态,0表示没有错误,其他任何值表明有错误10/21/2018西安理工大学计算机科学与工程学院
- 23. 变量篇示例:
#!/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 :$?"10/21/2018西安理工大学计算机科学与工程学院
- 24. 条件测试篇文件状态测试-d目录-r可读-f常规文件-w可写-L符号连接-x可执行-s文件长度大于0,非空-u文件有suid位设置示例: [ -s haison.c ] 0表示成功,其他为失败,下同。逻辑操作符
-a 逻辑与(and),操作符两边均为真,结果为真,否则为假。
-o 逻辑或(or),操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真,反之。示例: [ -r haison.c –a –w hai.c ]10/21/2018西安理工大学计算机科学与工程学院
- 25. 条件测试篇字符串测试=两个字符串相等-z空串!=两个字符串不相等-n非空串示例:[ -z $SHELL ]数值测试-eq数值相等(equal to)-lt第一个数小于第二个数(less than)-ne数值不相等(not equal to)-le第一个数小于等于第二个数-gt第一个数大于第二个数(greater than)-ge第一个数大于等于第二个数示例:[ “10” -eq “12” ]10/21/2018西安理工大学计算机科学与工程学院
- 26. 控制结构篇选择结构循环结构
if语句: if then else 提供条件测试
case 语句:允许匹配模式、单词或值for:每次依次处理列表内的信息,直至循环耗尽。
until:不常用。条件在循环末尾,至少执行一次。
while:条件在循环头部。10/21/2018西安理工大学计算机科学与工程学院
- 27. 控制结构篇——if语句格式1
if [ 条件 ]
then
命令
fi 格式2
if [ 条件 ] ; then命令
fi 或格式3
if [ 条件 ]
then
命令1
else
命令2
fi 格式4
if [ 条件1 ]
then
命令1
elif [ 条件2 ]
then
命令2
else
命令3
fi 示例
#!/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"
fi10/21/2018西安理工大学计算机科学与工程学院
- 28. 控制结构篇——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 10/21/2018西安理工大学计算机科学与工程学院
- 29. 控制结构篇——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` "
10/21/2018西安理工大学计算机科学与工程学院
- 30. 控制结构篇——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!"10/21/2018西安理工大学计算机科学与工程学院
- 31. 控制结构篇——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
10/21/2018西安理工大学计算机科学与工程学院
- 32. 函数篇格式
函数名 ()
{
命令
}
所有函数在使用前必须定义,这意味着必
须将函数放在脚本开始部分,直至shell解释
器首次发现它,才可以使用。
调用函数仅使用其函数名即可,要传给函
数的变量跟在函数后面。
函数里面定义的变量以下划线(_)开始。
函数可以放在同一个文件中作为一段代
码,也可以放在只包含函数的单独文件中,文
件也必须以#!/bin/sh开头。示例1
#!/bin/sh
#funTest
#to test the function
DATE=`date`
Hello()
{
echo “Hello,today is $DATE”
}
Hello示例2
#!/bin/sh
#funTest
#to test the function
. ./Hello
Hello10/21/2018西安理工大学计算机科学与工程学院