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