part1:Shell编程

advertisement
Linux开发基础
Development Foundation on Linux OS
方贤进, Ph.D & Associate Prof.
安徽理工大学 计算机科学与工程学院
1
Outline
 Shell programming on Linux OS
 GNU C/C++ programming
 CGI programming in C/C++ language
 Perl programming
 CGI programming in Perl language
2
Section 1
Shell programming on Linux OS
3
1.1 What is Shell?
 Shell is a command interpreter;
 Shell is a programming language, which
includes variable, keywords and all kinds of
control sentences;
The generic Shell on Unix OS is Bourne
Shell (for short, sh).
There are other kinds of shell,C-shell,
Korn Shell, etc.
4
1.2 How to create and execute
shell script?
Create a shell Script using VI editor
For example:
$vi test
Where vi is an editor, test is the file name
of shell script.
5
1.2 How to create and execute
shell script?
 To execute a shell Script
① Using input redirection. Let “sh” read commands from shell
script filename. E.g.
$sh < test
② Script filename is used as arguments of “sh” command. E,g.:
$sh script filename [script arguments]
③ Script file is set as “execute attribute”, then it can execute
directly
$chmod +x test
$./test
6
1.3 shell中的变量
1.3.1 Environment variables
① 可写的环境变量
 在用户登陆的过程中执行/etc/profile文件进行初始化
 各个用户自身的启动文件/home/username/.bash_profile
可通过set命令显示当前已经设置的环境变量及其值。
7
1.3 shell中的变量
1.3.1 Environment variables
② 只读的环境变量
环境变量
含义
$0
Shell script filename
$1~$9
First-ninth command line arguments
$*
All value of command line arguments
$#
The number of command line arguments
$$
The current process ID
$?
The exit status of the last command, “0” indicates
“success”, “1” indicates “failure”
$!
the process ID of the last background process
Shift <>
Shift position argument
8
1.3 shell中的变量
1.3.2 Shell variables defined by Users
definition:
Variable name=string
#delimiter may not be used
citation
$variable name
As a part of a string
#at the end of a string
string $variable name
#at the head of a string or in the middle of a string
string1${variable name}string2
9
1.4 shell中的特殊字符
1.4.1 Wildcard characters in Shell
 星号*
问号?
一对方括号[ ]
其作用是匹配该字符组所限定的任何一个字符,例如:
f[abcd]可以匹配fa,fb,fc,fd
f[a-d]与f[abcd]作用相同
感叹号
表示否定,例如f[!a-d].c表示以f打头、第二个字符不是a-d的.c文件名
10
1.4 shell中的特殊字符
1.4.2 Shell中的引号
 双引号””
由它括起来的字符,除$, `, \仍保留其特殊功能外,其余字符通常作为普通
字符
单引号’’
由它括起来的所有字符或字符串都作为普通字符出现。
倒引号``
由此括起来的字符串被shell解释为命令行,其执行结果取代整个倒引号部
分。例如:
$echo current directory is `pwd`
如果当前工作目录为/home/wang的话则输出结果为
current directory is /home/wang
11
1.4 shell中的特殊字符
1.4.3 Shell命令执行的顺序操作符
(1) 顺序执行
顺序分割符;
例如:$cd /home/fang; ls –l; cat a.txt
管道线|
例如: $who|wc –l|write root
(2)逻辑与
Command1&&command2&&…&&commandn
例如:$cp test1 /home/wang&&cat /home/wang/test1
(3)逻辑或
Command1||command2||…||commandn
例如:$cp test1 /home/wang || ls -l
12
1.4 shell中的特殊字符
1.4.4 Shell中的注释符、反斜线及后台操作符
(1)注释符#
(2)反斜线\
例如要显示字符$本身,就要用\$
$echo “this is a \$ dollar character”
(3)后台操作符&
$gcc file1.c&
13
1.5 shell编程中的输入输出命令
1.5.1 Shell中的输入输出标准文件
stdout
Stdin
stderr
1.5.2 Shell中的输入输出重定向
 <
$sh<testfile #shell脚本的一种执行方式
 >, >>
$cat test.c>test2.c
$cat>file2.txt
束符
#显示文件的内容到另一个文件
#通过键盘输入建立一个文件file2.txt,按^z作为文件结
14
1.5 shell编程中的输入输出命令
1.5.3 Shell中的输入输出命令
1. Read <variable1> <variable2>…
2. Echo <arguments list>
3. Echo 命令中使用的转义字符:
\b backspace, \c不将光标移动到下一行
\t table, \\ “\”本身, \f换页, \n 换行, \r回车
\0N ascii码的八进制N的字符, 如’\101’表示字符’A’
例如:
$echo “abcd” $’\t’ “efgh”
15
1.6 Shell中的程序控制结构语句
1.6.1 if 语句
if 条件判断
then 命令1
else 命令2
fi
 条件判断有“命令语句”和“测试语句”两种形式,
命令执行成功则条件为真,返回值为“0”,否则为
假,返回值非“0”
16
1.6 shell中的程序控制结构语句
1.6.2 命令语句形式的条件判断
例1:下面的一段代码首先判断一个指定的用户是否存在,若存
在则给出信息,否则向操作系统中增加一个用户。
if cat /etc/passwd|grep $1
#$1为脚本的命令行参数
then echo "There has existed user $1 in OS!"
else useradd $1
fi
例2:下面代码判断在当前工作目录中,一个指定的名字是目录、
文件还是不存在。
if test -f $1
#$1为脚本的命令行参数
then echo "$1 is a generic file!"
else if test -d $1
#else if 可以写成elif
then echo "$1 is a directory!"
else echo "$1 is not existed!"
fi
fi
17
1.6 shell中的程序控制结构语句
1.6.3 测试语句形式的条件判断
格式1:
Test expression
格式2:
[ expression ]
Example:
read a
#if test $a -gt 0
#用test测试
if [ $a -gt 0 ]
then echo "$a is greater than 0!"
else echo "$a is less than 0!"
fi
18
1.6 shell中的程序控制结构语句
1.6.3 测试语句形式的条件判断
注意:
如果使用shell变量,为保持完整,避免造成歧义,
最好用双引号将变量括起来
在任何运算符、圆括号、或方括号前后至少需要一个
空格
条件测试需要另起一行时,用\作为续行符。
19
1.6 shell中的程序控制结构语句
1.6.3 测试语句形式的条件判断
文件测试:
-r file
文件是否存在且是可读的
-w file
文件是否存在且是可写的
-x file
文件是否存在且是可执行的
-f file
文件是否存在
-d file
是否是目录
-p file
文件是否存在且是FIFO文件
-s file
文件是否存在且不是空文件
20
1.6 shell中的程序控制结构语句
1.6.3 测试语句形式的条件判断
字符串测试:
str
Str是否为空
str1 = str2
str1是否与str2相等
str1 != str2
str1是否与str2不相等
-n str
str的长度不为0则为真
-z str
str的长度为0则为真
21
1.6 shell中的程序控制结构语句
1.6.3 测试语句形式的条件判断
数值测试:
n1 –eq n2
n1=n2?
n1 –ne n2
n1<>n2?
n1 –lt n2
n1<n2?
n1 –gt n2
n1>n2?
n1 –le n2
n1<=n2?
n1 –ge n2
n1>=n2?
22
1.6 shell中的程序控制结构语句
1.6.4 CASE语句
case string1 in
Str1)
command-list1;;
Str2)
command-list2;;
…
Strn)
command-listn;;
esac
23
1.6 shell中的程序控制结构语句
1.6.4 CASE语句
例子:
echo "=======Menue======="
echo "1.Display calendar."
echo "2.Display current time."
echo "3.Display OS version."
echo "4.Dislay online Users."
echo "5.Exit."
echo "Please select:"
read choose
case $choose in
[Aa1]) cal;; #可以选择a,A,1执行第一个菜单项,下同
[Bb2]) date;; #正则表达式也可以写成B|b|2)
[Cc3]) uname -a;;
[Dd4]) w;;
[Ee5]) exit;;
esac
24
1.6 shell中的程序控制结构语句
1.6.5 for循环语句
格式:
for vairable [in argument-list]
do
command-list
done
例1:argument-list为变量值列表。显示1~10
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
25
1.6 shell中的程序控制结构语句
1.6.5 for循环语句
格式:
for vairable [in argument-list]
do
command-list
done
例2:argument-list为为文件表达式。打印当前目录下的所有文件名以s
打头的文件的内容
for i in s*
do
cat $i | pr #输出重定向到打印机
done
26
1.6 shell中的程序控制结构语句
1.6.5 for循环语句
格式:
for vairable [in argument-list]
do
command-list
done
例3:argument-list为空,此种情况等价于循环变量依次取位置参数的
值。
for vairable 等价于for varialbe in $*,$*表示所有脚本参数的值。
编写一个shell,第一位置参数为指定的目录名,其后的参数为第一个参
数指定目录下的文件,依次显示这些文件的内容。
To be continued!
27
1.6 shell中的程序控制结构语句
1.6.5 for循环语句
dir=$1;shift
# 取目录名后,位置参数向左移位
if [ -d $dir ]
then cd $dir
for name # in $*
do
if [ -f $name ]
then cat $name
echo "===end of this file!==="
else echo "===invalid file name:${dir}/${name}!==="
fi
done
else
echo "===invalid directory name:${dir}!==="
fi
28
1.6 shell中的程序控制结构语句
1.6.6 while循环语句—当型循环
While expression
Do
command-list
Done
例:显示1-100之间的整数
i=1
while [ $i -le 100 ]
do
echo $i
i=`expr $i + 1` #倒引号,expr是数值运算
done
29
1.6 shell中的程序控制结构语句
1.6.7 until循环语句—直到型循环
until expression
Do
command-list
Done
例:显示1-100之间的整数
i=1
until [ $i -gt 100 ]
do
echo $i
i=`expr $i + 1` #倒引号,expr是数值运算
done
30
1.6 shell中的程序控制结构语句
1.6.8 break、continue语句、算术运算、退出脚本命令
Break [n]
表示从while或until循环中跳出,n表示是跳出几层循环,
默认是1
Continue [n]
表示跳过循环体中在它之后的语句,回到循环开头,进行
下一次循环。
算术运算:expr n1 运算符 n2 运算符有+,-, *, /,%
退出脚本命令: exit [n], n为设定的退出值
31
1.6 shell中的程序控制结构语句
1.6.8 break、continue语句、算术运算
例:显示出2-100之间的所有素数
i=2
while [ $i -le 100 ]
do
j=2
flag=1 #flag为1表示i是素数
while [ $j -le `expr $i / 2` ]
do
if [ `expr $i % $j` -eq 0 ]
then flag=0;break
fi
j=`expr $j + 1`
done
if [ $flag -eq 1 ]
then echo "${i} is a prime!"
fi
i=`expr $i + 1`
done
32
1.6 shell中的程序控制结构语句
1.6.9 自定义函数
Functionname( )
{
Command-list
return [n]
}
编写一个测试文件/目录的函数
testfile( ) #函数定义
{
if [ -d $1 ]
then echo "$1 is a directory!"
else echo "$1 is not a directory!"
fi
return
}
testfile $1
#函数调用
33
1.6 shell中的程序控制结构语句
1.6.9 自定义函数
例:将判断一个数是否是素数写成一个函数,并调用之
prime( )
#函数定义
{
flag=1
j=2
while [ $j -le `expr $1 / 2` ]
do
if [ `expr $1 % $j` -eq 0 ]
then flag=0;break
fi
j=`expr $j + 1`
done
if [ $flag -eq 1 ]
then return 1 #返回值
else return 0
fi
}
prime $1
#函数调用
if [ $? -eq 1 ] #函数返回值保存在变量$? 中
then echo "$1 is a prime!"
else echo "$1 is not a prime!"
fi
34
Section 1 大作业
用shell编程设计一个Linux OS中的系统用户管理程序,包含3大功能:
1,设计一个文本菜单,包含所要实现的功能选项。
2,新用户增加。能够判断该用户是否已经存在,若存在给出出错信
息并要求重新输入新用户名,否则的话增加一个系统新用户,该用户
隶属于students组,shell为/sbin/nologin,home目录为
/home/students/username。并把该用户的初始口令设置为其用户
名。
3,用户查找功能。根据输入的用户名,查找该系统中是否已经有该
用户存在,若不存在则给出找不到的信息,否则的话显示所有该用户
帐号的有关信息。
4,删除用户功能。根据输入的用户名,查找该系统中是否已经有该
用户存在,若不存在则给出找不到的信息,否则的话删除该用户帐号
并将其宿主目录中的数据也一并删除。
参见/home/xjfang/shell/中shell程序useradmin的代码
35
Download