基础:
id:查看当前用户的信息
passwd:修改当前用户密码
whoami:显示当前用户
who:显示当前登录的所有用户
w:显示所有登录用户和正在进行的操作
hostname: 查看主机名
su:切换用户(-c string:从-c后的字符串读取 -i:实现脚本交互 -n:进行脚本的语法检查 -x:实现脚本逐条语句跟踪)
uname:查看本机信息(uname:显示操作系统–r:显示版本号–a:显示详细信息)
/etc/passwd:保存用户信息
/etc/shadow:保存用户密码
/etc/group:保存组信息
useradd:创建用户(-d:指定家目录-s:指定登录后shell -u:指定uid -g:指定组)
usermod:修改用户相关信息(-l:修改用户名-u:修改uid -d:修改家目录-g:修改所属组-L:锁定该用户-U:解锁用户)
userdel:删除用户(-r:删除用户时同时删除用户的家目录)
改变权限命令:chmod
chmod [-R] xyz 文件,其中xyz分别为三组rwx属性数值的和
pwd:显示当前工作目录(-p:显示当前路径而非link路径)
cd:切换目录(.当前目录 ..上一级目录 ~当前用户主目录 -上一个工作目录)
ls:列出目录内容(-l(long)列出目录内容细节,包括权限、所有者等 -a(all)列举目录全部文件,包括隐藏文件)
touch命令用于创建一个新的空白文件,如果文件已存在,则刷新修改日期。
file:查看文件类型
cat:查看文本文件内容
od:显示非纯文本文件内容(-t:指定输出格式 a默认字符 c是ascll字符输出 dox十进制八进制十六进制 f浮点数输出)
cp:复制文件或目录
-a:相当于-pdr的意思
-d:若源文件为链接文件,复制链接文件而不是文件本身
-i:若目标文件存在,覆盖时会询问
-p:连同文件属性一起复制,而不是使用默认属性
-r:递归复制整个目录树
-v:显示复制过程的详细信息
mv:移动或重命名文件或目录
rm:删除文件或目录 -i:交互式 -r:递归删除目录及包含内容 -f:强制删除
mkdir:创建一个目录(-m:指定权限 -p:递归创建)
rmdir:删除一个空目录(-p:将上层空目录也删除)
文件的三个时间属性
mtime:文件内容更改时会修改
ctime:文件属性(状态)更改时会修改
atime:文件内容被访问时会修改
echo:显示在命令行输入的内容
cat:显示文件内容
head:-n显示头n行
tail:-n显示尾n行、-f持续显示文件更新内容
more:翻页显示文件内容,只可向下翻页
less:翻页显示文件内容,可上下翻页
Linux查找命令:
[if !supportLists]1、 [endif]find:find【-指定目录】【-限定条件】【-指定动作】,默认搜索当前目录及子目录
使用find命令找出系统所有具有SUID权限的文件
find /bin/ –perm –u=s –o –perm –g=s
或find / -perm -4000
找出/etc目录下大于50k小于60k的文件
find /etc –size +50k –a –size -60k –exec ls–l \;
符合上述条件的非root文件
find /etc –size +50k –a –size -60k –not–user root –exec ls –l \;
(-perm:指定权限–o:表示或–a:表示并–exec:执行该参数给出的shell命令)
[if !supportLists]2、 [endif]locate:类find –name,更快,不搜索具体目录,搜索一个数据库
[if !supportLists]3、 [endif]whereis:只用于程序名的搜索,且只搜二进制文件(-b)、man说明文件(-m)、源代码文件(-s)
[if !supportLists]4、 [endif]which:在PATH变量指定路径中,搜某个系统命令的位置,返回第一个结果
fdisk 设备名:对该设备进行分区
mke2fs –t 文件系统名分区名:在指定分区创建文件系统(同mkfs分区名)
dumpe2fs 分区名:查看格式化好的文件系统
mount 要挂载的分区名挂载点目录:将设置好的分区挂载到某一个目录下
umount 分区名或挂载点名:卸载已挂载的分区
fuser、lsof:如果卸载失败,查看占用进程或文件
in命令用来简历硬链接(指向文件索引节点的指针)和符号链接(文件内容作为路径名去访问真正的共享文件):-f强迫建立链接–n如果new-file已存在,不创建链接–s建立一个符号链接而不是硬链接–d建立目录的硬链接
通过type命令可以查看命令的类型
shell脚本两种执行方式:
直接命令执行:有rx权限;路径要正确
以bash进程执行:有r权限;方法为bash/sh xxx.sh
Shell脚本相关命令:
echo命令:显示变量的值 echo $变量名/${变量名}
设置变量:变量名=变量值
取消变量:unset 变量名
查看环境变量:env
set命令查看所有变量:包括环境变量和自定义变量
export命令将自定义变量转换为环境变量
read命令从键盘读取变量值(-p:接提示语句–t:接等待秒数)
declare或typeset声明变量类型(-a:数组类型–i:整型–x:声明为环境变量–r:只读)
管道命令:
cut –d 分隔符–f field或者cut –c 字符范围:将同一行数据进行分解(-d:接分隔字符,与-f一起使用–f:依据-d将一段信息分隔,-f指定去哪一段–c:以字符的单位取出固定字符区间)
grep 参数字符串 filename:按条件取出某行(-a:以text文件的方式查找–c:计算字符串次数–i:忽略大小写–n:输出行号–v:反向选择–color=auto:颜色显示)
sort:对输入内容排序
uniq:去除结果中重复行
wc:统计字、字符、行(-l:仅列出行–w:列出多少字–m:列出多少字符)
tee:双向重定向
vi操作方式:命令模式、插入模式
进入:$下键入命令vi;离开:“:wq”、“:q!”
sh/bash命令:直接执行shell脚本(-n仅检查语法–v现将scripts内容显示在屏幕–x跟踪执行进程)
source命令:执行脚本可使脚本中的变量和值在脚本完成后继续起作用
test命令:test –e /demo && echo “exist” || echo “not exist”
(-z判断是否输入–e该文件名是否存在–f该文件名是否为文件–d该文件名是否为目录–r-w-x是否可读可写可执行–eq-ne是否相等不等 test str1=str2判断字符串是否相等)
账号管理相关文件:
/etc/passwd:用户账号信息
账号名称:密码:uid:gid:用户信息:主文件夹:shell
/etc/shadow:用户密码信息(可用chage命令修改下列字段)
账号名称:密码:最近更改日期:不可被更改的天数:需要重新更改的天数:警告天数:宽限天数:失效日期:保留
/etc/group:组账号信息
组名称:组密码:gid:该用户支持的账号(不包含初始用户组的用户)
初始用户组:一个新建的用户默认隶属于和其同名的用户组及初始用户组
有效用户组:决定该用户新建文件时的相关文件属性
(groups命令查看所属用户组,第一个为有效用户组;newgrp命令修改用户的有效用户组;finger和chfn可以查看和修改用户详细属性)
/etc/gshadow:组管理级密码信息
特殊权限管理ACL
概念:用于在传统UGO模型之外进行特殊权限管理。主要功能包括针对单一用户、单一用户组进行权限设置,划定某一文件的权限范围等。
Setfacl命令和getfacl命令:setfacl –m u:software:rx acltest1
[root@locathost ~]# setfacl [-bkRd]
[{-m|-x} acl参数] 目标文件名
参数:
-m: 设置后续的acl参数给文件使用,不可以与-x合用;
-x: 删除后续的acl参数;
-b: 删除所有的acl参数;
-k: 删除默认的acl参数;
-R: 递归设置acl,包括子目录;
-d: 设置默认acl参数,只对目录有效,新建目录时引用该参数。
acl参数有三种表现形式,分别针对用户、组和有效权限(权限上限):
u:[用户账号列表]:[rwx]
g:[用户组列表]:[rwx]
m:[rwx]
getfacl命令参数和setfacl命令参数类似。
磁盘配额管理概念:是指通过系统设定的方式,限定某一用户、某一用户组、某一特定链接使用磁盘空间的最大值。
限制方式:限制inode(限制文件数量)和限制block(限制磁盘空间大小)。限制值:sofe+hard的方式。
流程:通过脚本创建范例所需组及用户和密码》文件系统支持》新建quota配置文件》quota启动、关闭与限制值的设定。
(df命令:显示磁盘相关信息)
gcc命令:c语言编辑器(-o选项用于指定编译后的文件名,不指定则默认生成a.out。
./用于指定路径)
Linux程序设计5个调用函数
write():size_t write(int fildes, const void *buf, size_t nbytes); 将缓冲区buf的前n个字节写入文件描述符fildes关联的文件中,返回实际写入的字节数
read():size_t read(int fildes, void *buf, size_t nbytes); 从文件描述符fildes关联的文件中读入n个字节并放入缓冲区buf中,返回实际读入的字节数
open():open(const char *path, int flags); 创建一个新的文件描述符,如果调用成功则返回一个可以被read、write等调用使用的文件描述符
close():int close(int fildes)
iotcl():int iotcl(int fildes, int cmd,…) 为了向用户提供统一的接口,设备驱动程序封装了所有与硬件相关的特性,硬件的特有功能一般通过iotcl来完成
Linux程序设计环境
向程序传递参数:
main():int main(int argc, char *argv[]) argc保存参数个数,argv保存参数值
getopt():int getopt(int argc, char *const argv[], const char *optstring);
环境变量:putenv()和getenv()
获取底层时间值:time()
计算两个时间之间的差距:difftime()
设定时间的特定格式:gmtime()
tmpnam():用于生成一个唯一的文件名
tmpfile():需要立刻使用临时文件时,给其命名的同时将其打开
getuid()、getlogin():获取用户的相关信息
getpwuid()、getpwnam();获取用户信息的编程接口
gethostname()和uname():获取主机信息的编程接口
syslog():向日志文件添加日志信息
资源和限制:
系统策略的限制一般在头文件limits.h中
资源操作方面的限制一般定义在头文件resource.h中
work()函数将一个字符串写入临时文件10000次,然后通过一些算术运算形成CPU负载
main()函数调用work()函数,然后用getrusage()函数来获取程序耗费的CPU时间,并在屏幕上显示
main()函数调用getpriority()和getrlimit(),来获取当前优先级和文件限制大小
C语言链接MySQL数据库的两个步骤:1、初始化一个连接句柄2、建立连接
进程特征:
进程状态:
TASK_RUNNING:可执行状态/运行状态。进程在运行 ( 是系统的当前进程 ) 或者准备运行(等待被安排到系统的一个CPU上)。进程控制块有一个run_list成员,所有处于TASK_RUNNING状态的进程都通过该成员链在一起,称之为可运行队列。
TASK_INTERRUPTIBLE:可中断的睡眠状态。进程处于某个等待队列中,它能够被信号(signal)或中断唤醒。等待资源的请求满足时,也被唤醒。
TASK_UNINTERRUPTIBLE:不可中断的睡眠状态。进程处于某个等待队列中,不能被信号或中断唤醒,只有等待的资源被满足时才被唤醒。例如当进程打开一个设备文件时,使用TASK_UNINTERRUPTIBLE
TASK_ZOMBIE:僵尸进程,退出状态。进程已经停止,但还没有释放进程控制块
TASK_STOPPED:暂停状态。可能是被特定的信号终止,也可能是受其它进程的跟踪调用而暂时将CPU交给跟踪它的进程。
TASK_TRACED (2.6):暂停状态。
TASK_DEAD (2.6)
ps命令:查看系统中运行的进程的属性(报告进程状态)
top命令:实时监视CPU的活动状态。并允许你交互地控制这些进程
kill命令:终止PID的进程
在命令后面加&操作符:使该命令在后台操作
fg命令:使后台进程转到前台
bg命令:使被挂起的命令转到后台
ctrl-z:挂起一个前台进程
jobs:显示所有挂起的(停止的)和后台进程的作业号,确定哪一个是当前进程
suspend:挂起当前shell进程
ctrl-c:终止一个前台进程
终止后台进程方法:kill命令(软中断);先使用fg转到前台,再ctrl-c
计划任务:指由系统在某一时间或周期性自动执行的程序或应用(常用计划任务:日志轮替、日志分析、重建文件索引、删除临时文件、web分析)。
可以分为两种类型
例行性任务(crontab):按照设定的周期自动循环多次执行的工作。依赖于crond服务,通过crontab命令实现:
[root@www ~]# crontab [-u username][-l|-e|-r]
参数:
-u:给指定用户设置计划任务
-e:编辑计划任务内容
-l:查看计划任务内容
-r:删除所有计划任务
单词计划任务(at):按照设定的某一时间只执行一次的工作。依赖于atd服务,通过at命令实现:
[root@www ~]# at [-mldv] TIME
[root@www ~]# at -c
选项:
-m:当at工作完成后,以email通知用户计划任务完成情况
-l:相当于atq命令,列出目前系统上的所有at任务
-d:相当于atrm命令,可以取消一个at任务
-v:用时间格式列出at任务列表
-c:列出at任务的实际命令内容
参数:
TIME参数支持Linux中的兼容的时间格式
SELinux概念:
SELinux是为解决Linux系统权限管理缺陷导致的“内部员工误用”问题。这一缺陷的核心问题是:权限管理主要针对用户和文件,而真正运行的却是进程。
传统Linux权限管理机制——DAC,自主访问控制
Discretionary Access Control,即根据进程的所有者与文件的rwx权限来控制。
SELinux权限管理机制——MAC,强制访问控制
Mandatory Access Control,即针对特定的进程和特定的文件进行专门的权限控制。
SELinux机制:
SELinux安全上下文:
系统服务:Linux中系统服务是通过守护进程daemon来实现的。
守护进程根据功能可以分为两大类:
stand_alone:指可以独立启动并运行的守护进程。
super daemon:超级守护进程,指通过该进程去启动一系列其他进程的守护进程。
日志功能是Linux系统中非常重要的功能,是Linux管理员和使用者必须要熟练使用的功能。
Linux系统的日志功能是每个发行版都具备的功能,一般由下面三个系统服务(守护进程)来实现:
syslogd:完成系统与网络等常用日志功能;
klogd:完成与内核相关的日志功能;
logrotate:完成日志文件的轮替功能。
Linux系统中常用的日志文件有:
/var/log/cron:记录计划任务crontab的相关信息;
/var/log/messages:记录系统发生错误或异常等重要信息;
/var/log/httpd/*:记录Web服务器相关信息。
例如:mail.info /var/log/maillog_info
#这个配置指定mail服务产生的大于info等级的信息,记录在文件/var/log/maillog_info
Linux系统的启动流程为:
BIOS:硬件启动(基本输入输出系统,一般保存在主板的ROM中)
MBR:Master Boot Record(Linux启动过程中执行MBR中的前446个字节)
GRUB:操作系统引导程序(/boot/grub/grub.conf配置文件
使用dmesg命令可以查看系统引导过程中的相关信息
)
加载内核
init:第一个进程(主要功能包括:调用/etc/rc.d/rc.sysinit文件对系统进行初始化;挂载文件系统;根据运行级别启动相关服务和程序)
runlevel:相关应用程序
Linux的运行级别(通过/etc/inittab修改默认运行级别;每个级别对应的启动服务保存在/etc/rc.d/*.d中;使用runlevel命令可以查看当前和上一次运行级别;使用init命令可以改变当前运行级别):
0:关机
1:单用户模式
2:不带网络模式的多用户
3:普通多用户模式
4:未使用
5:图形化界面
6:重新启动
软件源管理器:
简答题:
[if !supportLists]1、 [endif]MBR和GPT的特点,MBR的分区流程
MBR是建立在BIOS技术基础上的传统分区机制,支持32位和64位系统,支持分区数量有限,寻址空间为32位,最大支持大小为2TB的硬盘。GPT是建立在UEFI技术基础上的新分区机制,解决MBR机制的缺陷,支持超过2TB的硬盘,必须使用64位系统,向后兼容MBR。
MBR分区步骤(文件系统管理):使用fdisk命令(/分区工具)进行磁盘管理。对分区指定文件系统(即mke2fs命令在指定分区上创建文件系统)。挂在文件系统(mount命令)。
2、dbm基本概念。属于什么库?与MySQL的区别?适用场景?优缺点?
Dbm数据库是一个基于索引的文件系统,并不是严格意义上基于关系的数据库系统;而MySQL数据库是一个开源的、基于关系的典型数据库系统。
在Linux环境下的软件开发中,dbm数据库适用于数据存储量不大、访问效率要求高,平台相关性不大的系统中,比如RPM、LDAP、Apache等软件中。而MySQL适用于一般的软件应用系统,使用MySQL必须安装其DBMS系统。
优缺点:dbm数据库查询和取出速度非常快,但是存入或修改通常较慢。
3、RAID概念、种类及适用场景
RAID是指一种通过将多个较小的磁盘整合成为一个大磁盘的技术。
RAID-0等量模式,性能最佳。需要速度,不需要安全,是要求最高速度和最大容量的用户的理想选择,如暂存盘或swap。(将磁盘先切除等量的区块,然后当一个文件要写入RAID时,文件会依据区块大小切割好,依序放入各个磁盘)
RAID-1映像模式,完整备份。更注重安全性而非速度的情况。(让同一份文件完整保存在凉快磁盘上面)
RAID-0+1 性能为主,兼具高安全性。(先让两个磁盘组成RAID-0,再将两组RAID-0组成RAID-1)
RAID-1+0 并发需要高效能及高安全性,如图像编辑。(与上相反)
RAID-5 空间、性能和安全的平衡,如独立存储;适合那些追求性能并要求持续访问数据的用户(如视频编辑人员)使用。(写入类似RAID-0,不过在循环写入过程中,在每个磁盘加入一个同为检查数据parity,记录其他磁盘的备份数据,用于磁盘损毁时的数据恢复)
4、Linux C程序设计的特点
Linux只需少量函数就可以实现对文件和设备的访问和控制,并且硬件、内核到系统都可以访问到。
(百度)Linux系统下编程的特点是直观且清晰,相比非Linux系统而言,你在制作程序的时候考虑的是具体调用哪些库中的什么内容,对应权限下可以执行到的地步,相当于在编程过程中了解系统结构与知识,可以制作出更加底层的对话。这与其它非Linux系统编程不同,非Linux对系统的编程多是表现在对封装后的API进行的调用,可以发挥想象力的地方都有一定的局限性。
大编程:
[if !supportLists]1、 [endif]新建进程
(1)两个进程,子进程打印10遍,父进程打印5遍,父进程等待子进程结束再结束
#include
int main()
{
pid_tpid;
char*message;
intn;
intexit_code;
printf("forkprogram starting\n");
pid= fork();
switch(pid)
{
case-1:
perror("forkfailed");
exit(1);
case0:
message= "child";
n= 10;
exit_code= 1;
break;
default:
message= "parent";
n= 5;
exit_code= 0;
break;
}
for(; n > 0; n--)
{
puts(message);
sleep(1);
}
if(pid != 0)
{
intstat_val;
pid_tchild_pid;
child_pid= wait(&stat_val);
printf("childfinshed\n");
}
exit(exit_code);
}
(2)编写一段C程序完成:父进程创建一个子进程,父进程对子进程设置一个报警信号,然后父进程等待子进程的结束,如果此时报警信号先到,就终止子进程。
#include
#include
#include
#include
#include
#include
void killchild(int pid_child);
void killchild(int pid_child){
printf("killing child process /n");
//调用wait函数
int pidxx;
pidxx=wait(NULL);
printf("killed the child process, whose pid is %d /n",pidxx);
exit(0);
}
void killyourself(int ownid);
void killyourself(int ownid){
//printf("killing child process %d /n",pid_child);
printf("parent sent signal, childprocess killed itself /n");
exit(0);
}
int main(){
//要捕捉的信号
(void) signal(SIGALRM,killchild);
intpid_child=0;
intpid = fork();
if(pid==-1){
perror("fork failed/n");
// exit(1);
exit(EXIT_FAILURE);
}
if(pid==0){
//子进程
pid_child=getpid();
//子进程也signal一个信号
(void) signal(SIGHUP,killyourself);
sleep(10);
kill(getppid(),SIGALRM);
}else{
//父进程
//等待
// pause();
sleep(6);
kill(pid_child,SIGHUP);
exit(0);
}
}
(3)编写一段程序,适用系统调用fork( )创建两个新的子进程,此程序运行使系统中有三个活动进程存在。控制让一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和字符“c”。试观察屏幕上的显示结果,并对输出结果进行分析。在实验报告中写出说明和分析。
#include
main()
{
int p1,p2;
while((p1=fork())= =-1);
if(p1==0)
putchar('b');
else
{
while((p2=fork())==-1);
if(p2= =0)
putchar('c');
else putchar('a');
}
}
运行
运行结果:root@localhost ~]# gcc -o lsj lsj.c
[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
ba[root@localhost ~]# c./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
ca[root@localhost ~]# b
分析原因:①从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。
②由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。
(4)编写一段程序实现父进程创建一个子进程,通过系统调用使子进程和父进程执行不同的任务。(提示:利用system(), exec系列函数)
试思考,怎样实现进程间的同步?
#include
#include
#include"stdlib.h"
void execCreate()
{
int pid;
pid=fork();
switch(pid)
{
case -1:
printf("子进程创建失败...\n");
exit(0);
case 0:
execl("/bin/ps", "ls", "-l", NULL);
printf("exec系统调用失败...\n");
exit(0);
default:
wait(9000);
printf("查询进程情况成功...\n");
exit(0);
}
}
void main()
{
execCreate();
}
2、进程与同步
管道读
#include
#include
#include
#include
int main()
{
FILE*read_fp;
char buffer [BUFSIZ + 1];
int chars_read;
memset(buffer,‘\0', sizeof(buffer));
read_fp=popen(“uname –a”,”r”);
if(read_fp!=NULL)
{
chars_read=fread((buffer,sizeof(char),BUFSUZ,read_fp);
if(chars_read>0)
{
printf(“Output was:\n%s\n,buffer);
}
pclose(read_fp);
exit (EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
管道写
#include
#include
#include
#include
int main()
{
FILE*write_fp;
char buffer [BUFSIZ + 1];
sprintf(buffer,"Once upon a time,therewas...\n");
write fp = popen("od-c","w");
if(write_fp!=NULL)
{
fwrite((buffer,sizeof(char),strlen(buffer),write_fp);
pclose(write_fp);
exit (EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
3、编写一个Linux C语言程序,接受输入一个任意长度的字符串并输出
(提示:内存管理,实验malloc函数和realloc函数)
#include
#include
#define CHUNKSIZE 100
int main()
{
char *string;
int i=0,c;
string=malloc(sizeof(char)*CHUNKSIZE+1);
if(string==NULL)
{
printf("out of memory");
return 1;
}
while((c=getchar())!=EOF)
{
string[i]=c;
i++;
if(i%CHUNKSIZE==0)
{
string=realloc(string,sizeof(char)*CHUNKSIZE*(i/CHUNKSIZE+1)+1);
if(string==NULL)
{
printf("out ofmemory");
return 1;
}
}
}
printf("\n\norgin string is:\n%s\n",string);
free(string);
return 0;
}
小编程:
1、shell编程
(1)输入四个数,输出总和,求最大、最小数(shell)
read max
min = $max
sum = $max
i = 1
while[$i - lt 4]
do
readx
sum= $(($sum + $x))
if[$max- lt $x]
then
max= $x
fi
if[$x- lt $max]
then
min= $x
fi
i= $(($i + 1))
done
echo "sum:$sum max:$max min:$min"
(2)shell脚本:从命令行输入100个数,输出总和、最大值、最小值。
#!/bin/sh
for i in `seq 100 `
do
read var
echo $var >> tempfile.tmp
done
echo "max number is :"`sort-n tempfile.tmp |head -n1 `
echo "min number is :"`sort-rn tempfile.tmp |head -n1 `
echo "sum of all number:"`awk '{a+=$0}END{ print a}' tempfile.tmp `
rm tempfile.tmp
(3)编写一个shell脚本,从命令行输入10个数,当输入的数中包含0或负数时输出’error’,同时将错误信息保存在/tmp/err文件;否则,输出这十个数的乘积。
#!/bin/bash
all=$*
if [ $# -ne 10 ];then
echo error|tee -a /tmp/err
exit 1
fi
sum=1
for i in $all
do
if [ $i -le 0 ];then
echo error|tee -a /tmp/err
exit 1
else
sum=`expr $sum \* $i`
fi
done
echo $sum
(4)shell脚本范例
首先说明下列脚本的功能,然后假设用户 输入的inputname为tmp,当前日期为2015/06/24 15:00:00,描述脚本的最终运行结果。
[if !supportLists]5、 [endif]进程5个调用
案例1:
/*预先准备好文件file.in,大小不超过1MB*/
#include
#include
#include
#include
int main() {
charc;
intin, out;
in= open(“file.in”, O_RDONLY);
out= open(“file.out”, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while(read(in,&c,1)== 1)
write(out,&c,1);
exit(0);
}
结果:
$ TIMEFORMAT=”“ time ./copy_system
4.67user 146.90system 2:32.57elapsed 99%CPU
...
$ ls -ls file.in file.out
1029 -rw-r---r- 1 neil users 1048576 Sep 1710:46 file.in
1029 -rw------- 1 neil users 1048576 Sep 1710:51 file.out
案例2:
#include
#include
#include
#include
int main() {
charblock[1024];
intin, out;
intnread;
in= open(“file.in”, O_RDONLY);
out= open(“file.out”, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while((nread= read(in,block,sizeof(block))) > 0)
write(out,block,nread);
exit(0);
}
案例3:
#include
#include
int main() {
intc;
FILE*in, *out;
in= fopen(“file.in”,”r”);
out= fopen(“file.out”,”w”);
while((c= fgetc(in)) != EOF)
fputc(c,out);
exit(0);
}
5、makefile文件
列出下面makefile文件中的目标和依赖关系,然后列出当b.h文件修改时的输出
6、例行计划任务
例:假设女朋友生日是5月2日,你想要在5月1日23:59发一封email给她,这封信内容已经写在/ home/dmtsai/lover.txt 内了。
59 23 1 5 * mail kiki <
/home/dmtsai/lover.txt(< 标准输入流)
例:每五分钟需要执行/home/dmtsai/test.sh一次。
*/5 * * * * /home/dmtsai/test.sh
例:每星期六都与朋友有约,那么想要每星期五下午4:30告诉朋友星期六的约会不要忘记。
30 16 * * 5 mail friend@***.com
4、编写一个Linux C语言程序,查看当前系统的shell环境和java环境
(提示:Linux程序设计环境——环境变量)