msgbartop
如果你只会一门语言,不能达到一个普通程序员的水平,你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。 — 埃里克·雷蒙
msgbarbottom

SHELL编程笔试题

几道不错的SHELL题目,收藏下
1.用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#1.sh
#判断一文件是不是字符或块设备文件,如果是将其拷贝到 /dev 目录下
#file executable: chmod 755 1.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "The program will Judge a file is or not a device file.\n\n"
read -p "Input a filename : " filename
if [ -b "$filename" -o -c "$filename" ]
then
       echo "$filename is a device file" && cp $filename /dev/ &
else
       echo "$filename is not a device file" && exit 1
fi

----------------------------------------------------
2. 设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#2.sh
#设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
#file executable: chmod 755 2.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
groupadd class1
for i in {9901..9930}
do
       xx=`echo $i | sed 's/99//g'`
       useradd -g class1 std$xx
       echo std$xx | passwd std$xx --stdin
       echo -e "user std$xx password is std$xx" >> /root/newuser.txt
done

-------------------------------------------
3.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#4.sh
#编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。
#file executable: chmod 755 3.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
i=1
while [ i -le 50 ]
do
   let i++
       userdel -r stud$i
done

---------------------------------------------
4.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;
(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;
(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
(4)在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);
(5)在早晨8:00前开机后启动。

vim /etc/crontab 在里面增加下面内容:

1
2
3
4
50 16 * * * root rm -rf /abc/* 2>&1 &
00 8-18 * * * root cat /xyz/x1|awk '{print $1}' >> /backup/bak01.txt 2>&1 &
50 17 * * 1 root cd /data;tar -zcvf backup.tar.gz * 2>&1 &
55 17 * * * root umount /hdc 2>&1 &

5)在早晨8:00前开机后启动 –> 这个我不是很明白它的意思,不知道是不是8点前开机就启动上面的设定,8点后才开机就不用启动的意思。
姑且用下面这个命令吧
chkconfig –level 2345 crond on

---------------------------------------------
5.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名
为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。

vim /usr/bin/fileback.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
#fileback.sh
#file executable: chmod 755 fileback.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
filename=`date +%y%m%d`_etc.tar.gz
cd /etc/
tar -zcvf $filename *
mv $filename /root/bak/

——————————————————
vim /etc/crontab 加入
* * 1 * * root ./fileback.sh &

------------------------------------------------
6.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
可以用 contab -e 来做,和上面一题差不多。

7.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其
中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
#7.sh
#file executable: chmod 755 7.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for ((i=1;i<=50;i++))
do
       mkdir -p /usrdata/user$i
       cd /usrdata
       chmod 754 user$i
done

原文地址:http://hi.baidu.com/whq4557/blog/item/455d54fc2fe393f5fc037fe2.html

Tags:

Win7系统下安装Zend Studio5.5

终于找到了在Windows7中安装Zend Studio 5.5的方法,收藏下

Zend studio5.5在Win7、Win2008Server等系统下安装的时候会出现很奇怪的问题,例如,按钮、单选框和复选框等都无法显示,给正确配置安装带来困难。即使全部点下一步并安装完成,打开程序时弹一个框就不见了,无法正常启动。

Zend studio5.5在Win7、Win2008Server等系统下安装的时候会出现很奇怪的问题,例如,按钮、单选框和复选框等都无法显示,给正确配置安装带来困难。即使全部点下一步并安装完成,打开程序时弹一个框就不见了,无法正常启动。

经过参考网上的一些解决办法,整理如下:
1.下载最新的JRE(Java Runtime Environment),可上java官网下载,我安装的是JRE6。
2.使用WINRAR解压 Zend Studio 5.5.1.exe。该文件双击时会直接安装,而不显示解压的文件夹。因此,需要安装winrar后,在右键弹出菜单中选择解压。
3.进入解压后的文件夹 Zend Studio 5.5.1\Windows(下面简称A文件夹),将resource目录下的jre文件夹重命名为jre.back(或其他名称都可).
4.复制JRE安装目录(C:\Program Files\Java\jre6)中的jre6到第03步中的文件夹A,并将文件夹jre6重命名为jre。
5.执行安装A文件夹下的 Zend Studio 5.5.1.exe
6.安装完成后将A文件夹下resource目录中的jre.back文件夹复制到Zend Studio的安装目录中。
7.重命名安装目录中的 jre 文件夹为 jre6
8.重命名安装目录中的 jre.back 文件夹为 jre
9.在ZendStudio图标上点击右键/属性/兼容性 设置兼容模式为 Vista
10.启动Zend Studio

原文:http://www.cnblogs.com/jyginger/archive/2010/07/23/1783966.html

[C]指针数组和数组指针

数组相关知识点:

  • 定义数组时必须明确指定数组元素的个数,不能使用变量指定数组元素的个数,只能使用常量或常量表达式
  • 数组名实际上就是指向数组第一个元素的指针

指针数组:是指所有元素都是指针的数组, 即“存储指针的数组”,如 int *p[10]

数组指针:是指指向一个数组的指针,即“指向数组的指针”,如 int (*p)[10]

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdlib.h>
#include <stdio.h>
 
int main(int argc, char **argv)
{
    char array[5] = {'a', 'b', 'c', 'd', 'e'};
    //定义一个指针数组
    char *point_array[5];
    //定义一个数组指针,使用数组array的首地址初始化
    char (*array_point)[5] = &array;
 
    int i;
 
    for(i = 0; i < 5; i++) {
	//使用数组a的第i个元素的地址给指针数组第i个元素赋值
	point_array[i] = &array[i];
	//输出原数组的第i个元素的值
	printf("a[%d] = %c\n", i, array[i]);
	//输出指针数组第i个元素的值
	printf("*point_array[%d] = %c\n", i, *point_array[i]);
	//输出数组指针所指向数组的第i个元素的值
	printf("*array_point[%d] = %c\n\n", i, (*array_point)[i]);
    }
 
    return 0;
}

memcopy 和memmove

1.memmove

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

2.memcpy

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

3.两者区别

函数memcpy() 从source 指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。

而memmove(),如果两函数重叠,赋值仍正确进行。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;

如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:

阅读全文»

Ubuntu Manpage

本地安装

sudo apt-get install manpages-dev

在线查阅地址:

http://manpages.ubuntu.com/

[C函数]从字符串的两端删除空白字符或其他自定义字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
static char *do_trim(char *input, char *what, int mod);
 
char *trim(char *c, char *what)
{
	return do_trim(c, what, 3);
}
 
char *ltrim(char *c, char *what)
{
	return do_trim(c, what, 1);
}
 
char *rtrim(char *c, char *what)
{
	return do_trim(c, what, 2);
}
 
static char *do_trim(char *input, char *what, int mod)
{
	char mask[256];
	int input_len, what_len;
	int i;
	int trimmed = 0;
	char *retval;
 
	if(!what) {
		what = " \n\r\t\v\0";
	}
 
	memset(mask, 0, 256);
	input_len = strlen(input);
	what_len = strlen(what);
 
	for(i = 0;  i < what_len; i++) {
		mask[what[i]] = 1;
	}
 
	if(mod & 1) {
		for(i = 0; i < input_len; i++) {
			if(mask[input[i]]) {
				trimmed++;
			} else {
				break;
			}
 
		}
		input_len -= trimmed;
		input += trimmed;
	}
 
	if(mod & 2) {
		for(i = input_len-1; i >= 0; i--) {
			if(mask[input[i]]) {
				input_len--;
			} else {
				break;
			}
		}
	}
 
	if((retval = (char *)malloc(input_len+1)) == NULL) {
		return NULL;
	}
        retval[input_len] = '\0';
	memcpy(retval, input, input_len);
 
	return retval;
}

GNU build system autotools 相关资料收集

http://www.gnu.org/software/autoconf/manual/autoconf.html

http://www.gnu.org/software/automake/manual/automake.html

http://www.lrde.epita.fr/~adl/autotools.html

http://en.wikipedia.org/wiki/GNU_build_system

http://blog.csdn.net/romandion/archive/2007/07/13/1688234.aspx

http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html

http://www.shangshuwu.cn/index.php/Linux应用程序编译方法

Tags: ,

configure.in(ac)中添加mysql相关开发动态库文件链接处理

Linux中C语言开发autotools中在configure.in(ac)中添加mysql相关开发动态库文件链接处理

在编译时可通过使用–with-mysql=PATH指定mysql的安装路径

参考自memcached中libevent处理

阅读全文»

测试网页响应时间的shell脚本[需要curl支持]

用法及返回结果如下:
lvyaozu@lvyaozu-desktop:~/shell$ ./requesturl.sh -n20 http://www.baidu.com
Request url: http://www.baidu.com
Request number: 20
Request Failed: 0
——Average Value——
time_connect: 0.1614
time_total: 0.1693
time_namelookup: 0.0088
————————-
请求参数:
-n 指定发送多少次请求,默认为10

返回结果为 curl -w 选项返回值,以下摘自curl官方文档:

http://curl.haxx.se/docs/manpage.html

time_connect The time, in seconds, it took from the start until the TCP connect to the remote host (or proxy) was completed.
time_total The total time, in seconds, that the full operation lasted. The time will be displayed with millisecond resolution.
time_namelookup The time, in seconds, it took from the start until the name resolving was completed.

代码:

阅读全文»

Tags: ,

一段统计日志中记录次数的shell脚本

记这里,下周一上班完善下可以直接用了,嘿嘿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
log_dir=/home/lvyaozu/logs
count_dir=/home/lvyaozu/logs
filename=$year"_"$month"_"$day
fileext=".log"
log_file=$log_dir"/"$filename$fileext
 
echo $log_file;
 
if [ ! -f $log_file ]
then
        echo "log file: "$log_file" does not exist!";
        exit 1;
fi
if [ ! -d $count_dir ]
then
        echo "count directory :"$count_dir"does not exist!";
        exit 2;
fi
 
sort_file_name=$count_dir"/"$filename"_sort"$fileext;
top_file_name=$count_dir"/"$filename"_top"$fileext;
echo $sort_file_name;
echo $top_file_name;
 
awk 'BEGIN{OFS=":"}{if($1) a[$1]++}END{for(i in a)print a[i],i}' $log_file | sort -r -t":" -k1 -n > $sort_file_name
awk -F: '{print substr($0,length($1)+2)}' $sort_file_name > $top_file_name

Tags: