1、Shell部分(35分)
1.1、$*, $@, $#,$0,$?有什么区别?(3分)
[答] $*和$@都表示参数列表; $#表示参数的个数,常用于循环; $0表示当前脚本名称; $?表示上一个命令退出的状态码.1.2、如何获取文本文件的第10行(2分)
[答]
1) cat a.txt | awk 'NR==10'
2) cat a.txt | sed '10!d'
3) cat a.txt | head -n 10 | tail -n 1
4) cat a.txt | grep -E "^10"
1.3、假如文件中每行第一个元素是Find,如何获取第二个元素
[答] awk '{ if ($1 == "FIND") print $2}'1.4、两个整数相加,还有若干种方法实现
[答]:
A=5
B=6
echo $(($A+$B)) # 方法 2
echo $[$A+$B] # 方法 3
expr $A + $B # 方法 4
echo $A+$B | bc # 方法 5
awk 'BEGIN{print '"$A"'+'"$B"'}' # 方法 6
1.5、如何检查文件系统中是否存在某个文件
答:find + filename
1.6、如何在后台运行脚本
1. 使用&符号在后台执行命令
你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:
$ ./my-shell-script.sh &
2. 使用nohup在后台执行命令
使用&符号在后台执行命令或脚本后,如果你退出登录,这个命令就会被自动终止掉。要避免这种情况,你可以使用nohup命令,如下所示:
$ nohup ./my-shell-script.sh &
3. 使用screen执行命令
通过nohup和&符号在后台执行命令后,即使你退出登录,这个命令也会一直执行。但是,你无法重新连接到这个会话,要想重新连接到这个会话,你可以使用screen命令。
Linux的screen命令提供了分离和重新连接一个会话的功能。当你重新连接这个会话的时候,你的终端和你分离的时候一模一样。
4. 使用at将一个命令作为批处理执行
使用at命令,你可以让一个命令在指定的日期和时间运行,例如要在明天上午10点在后台执行备份脚本,执行下面的命令:
$ at -f backup.sh 10 am tomorrow
5. 使用watch连续地执行一个命令
要想按一个固定的间隔不停地执行一个命令,可以使用watch命令,如下所示:
$ watch df -h1.7、如何在脚本文件中重定向标准输出和标准错误流到log.txt 文件?
在脚本文件中添加 "exec >log.txt 2>&1" 命令。
1.8 ${variable:-10} 和${variable: -10} 有什么区别?(2分)
答:
${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量
${variable: -10} - 输出 variable 的最后 10 个字符
1.9 哪个命令将命令替换为大写?(2分)
答:tr '[:lower:]' '[:upper:]'
1.10 [[$string == abc*]] 和 [[$string == “abc”]] 有什么区别?
答:
[[ $string == abc* ]] - 检查字符串是否以字母 abc 开头
[[ $string == "abc" ]] - 检查字符串是否完全等于 abc
1.11 如何在bash中定义数组?如何打印数组的所有元素?如何输出所有数组索引?
答:定义数组:
1)用[]操作符
2)使用()直接赋值
3)用declare –a定义数组.这种方法可以将一个空的变量定义成数组类型
4)从文件中读取数组
打印数组的所有元素:
1)按索引来遍历
#!/bin/bash names=(Jerry Alice David Wendy) for((i=0;i<${#names[*]};i++)) do echo ${names[$i]} done
2)不按索引来遍历
#!/bin/bash names=(Jerry Alice David Wendy) index=0 for i in ${names[@]} do echo "${index} ==> ${i}" let index++ done
1.12 设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日.Shell程序fileback存放在/usr/bin目录下.(6分)
答:
vim /usr/bin/fileback.sh #!/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 &
2、Python部分(30分)
2.1、简单说明下Python是如何进行内存管理的?(4分)
答:
1)引用计数:
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
2)垃圾回收:
(1)当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
(2)垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。
3)内存池机制:
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
2.2、什么是lambda函数?它有什么好处?(4分)
答:
Lambda函数的定义:
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。 (注意:lambda 函数不能包含命令,它们所包含的表达式不能超过一个)
lamda函数的好处:
(1)lambda函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下;
(2)匿名函数,一般用来给filter,map这样的函数式编程服务;
(3)作为回调函数,传递给某些应用,比如消息处理。2.3、请写出一段Python 代码实现删除一个 list 里面的重复元素(4分)
答:
第一种方式:
aa = {1,2,3,4,3,2,1,3,4} print list(set(aa))
第二种方式:
aa = {1,2,3,4,3,2,1,3,4} b = {} b = b.fromkeys(aa) c = list(b.keys()) print c
2.4、如何用 Python 来进行查询和替换一个文本字符串?(2分)
答:
查找:
>>> s = 'Cat and Dog' >>> s.find('Dog') 8 >>> s.index('Dog') 8 >>> s.find('Duck') -1
替换:
>>> s = 'Cat and Dog' >>> s.replace('Cat', 'Dog') 'Dog and Dog'
2.5、简单说明下单引号,双引号,三引号的区别?(5分)
答:
(1)单引号跟双引号的普通用法是相同的
(1) str1 = 'aaa' (等价于str = "aaa") (2) str2 = 'aaa,\ bbb' (等价于str2 = "aaa,\ bbb") 打印str1, str2 分别是 aaa aaa,bbb
(2)单引号跟双引号的区别主要体现在当用单引号包起来的字符串里包含"的时候, 不需要使用转义符(\), 反过来也是一样
(1) str1 = 'aaa"bbb' (2) str2 = "aaa'bbb" 打印str1, str2分别是 aaa"bbb aaa'bbb
(3)三引号有两种形式("""字符串内容""", 或者'''字符串内容''')
<1>这两种形式的用法几乎没有区别, 但是要严格来说的话, 也是有上面那样的区别
str1 = '''aaa"""bbb'''(等价于"""aaa\"""bbb""") str2 = """aaa'''bbb"""(等价于'''aaa\'''bbb''')
<2>三引号的核心用法主要体现在跨行的字符串上, 会包含两个界定符号之间的所有字符,包括看得见的, 看不见的, 如回车换行符
str1 = '''aaa bbb''' 打印 str1 aaa bbb
基于三引号的这种特性, 当需要格式化输入多行字符的时候可以减少转义字符的输入。
<3>还有就是pytho没有多行注释符号, 一般用三引号代替
2.6、Python 里面如何生成随机数?(3分)
答:
1)随机整数:
random.randint(a,b):返回随机整数x,a<=x<=b
2)包含范围的随机整数 :
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
3)0-1之间的随机浮点数 :
随机实数:random.random( ):返回0到1之间的浮点数
4)指定范围的随机浮点数 :
random.uniform(a,b):返回指定范围内的浮点数。2.7、如何用Python 来发送邮件?(8分)
答:
# -*- conding:UTF-8 -*- # 功能: 发送简单的文本邮件 # 注意: 确保该代码可用请先到发送者邮箱后台开启 SMTP 登录功能,并获得第3方登录密码 # 注意: 使用163邮件服务器时,可用 SMTP()方法,25端口进行登录 # 注意: 使用腾讯邮件服务器时,必须使用 SMTP_SSL()方法,465端口进行登录 import smtplib # 导入 smtplib 邮件处理库 from email.mime.text import MIMEText from email.utils import formataddr mail_server = "smtp.163.com" # 发件人的 SMTP 服务器 port = "25" # 服务端口 sender = "********@163.com" # 发件人邮箱帐号 sender_passw = "********" # 发件人邮箱密码(第3方登录授权密码) receiver = "**********@qq.com" # 收件人邮箱帐号 msg = MIMEText(mail_msg, "plain", "utf-8") # 邮件内容(正文) 需要发送HTML文件时,plain 改为 html 即可! msg['From'] = formataddr(["发件人邮箱昵称", sender]) # 发件人信息 msg['To'] = formataddr(["收件人邮箱昵称", receiver]) # 收件人信息 msg['Subject'] = "邮件的主题" # 邮件的主题 def sendMail(mail_server, port, sender,sender_passw, receiver): try: mail = smtplib.SMTP(mail_server, port) # 使用SMTP()方法指向服务器(使用QQ邮箱服务器时,需改用 SMTP_SSL()方法) mail.login(sender, sender_passw) # 请求服务器,登录帐号 mail.sendmail(sender, [receiver], msg.as_string() ) # 发送邮件(给receiver传入列表时,表示群发) mail.quit() # 断开连接 print("邮件发送成功!") except: mail.quit() print("邮件发送失败!") sendMail(mail_server, port, sender, sender_passw, receiver)
3、JAVA部分(15分)
3.1、JDK 和 JRE 的区别是什么?(3分)
答:
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。3.2、“static”关键字是什么意思?Java中是否可以覆盖(override)一个 private 或者是 static 的方法?(4分)
答:
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
覆盖,也就是重写, 前提条件是需要继承,父类中用private修饰的方法,对子类都不可见,继承不了,所以没有所谓的重写。
3.3、进程和抽象类的区别是什么?(4分)
答:
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类;
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
3.4、进程跟线程的区别是什么?(4分)
答:
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
4、数据库类(20分)
阅读下列说明,回答问题1-9:
CREATE TABLE Department (dept_id VARCHAR(2) not null, -- 部门编号 dept_name VARCHAR(20) not null, -- 部门名称 dept_leader VARCHAR(10) -- 部门经理 );
CREATE TABLE Personnel ( id VARCHAR(4) not null, -- 员工号 name VARCHAR(10) not null, -- 姓名 dept_id VARCHAR(2) not NULL, -- 部门编号 age integer, -- 年龄 gzsj date, -- 参加工作时间 technical_post VARCHAR(10), -- 职称 salary integer -- 薪水 );
问题:
1、(3分)写出表 Department 增加一条记录和更新提条记录的SQL语句。
增加记录值(‘12’,‘研发部’,‘张三’);
更新 dept_id=‘12’的记录(‘12’,‘研发部’,‘张三新’)
答:
增加记录: INSERT INTO Department(dept_id,dept_name,dept_leader) VALUES('12','研发部','张三') 更新记录: UPDATE Department SET dept_leader = '张三新' WHERE dept_id = '12'
2、(2分)需要给表Department增加一列字段 notes,长度为 10的字符串,默认值为‘0’,请写出相关SQL语句。
答:
ALTER TABLE Department ADD notes VARCHAR(10) DEFAULT 0;
3、(2分)查找工资大于2000 元的员工记录,并按员工号 id 升序排列。
答:
SELECT name FROM Personnel WHERE salary > 2000 ORDER BY id;
4、(2分)查找工资大于2000元的员工所在部门、部门编号、部门经理、员工名称。
答:
CREATE table ddd AS SELECT dept_name,dept_id,dept_leader FROM Department WHERE dept_id =(SELECT dept_id FROM Personnel WHERE salary > 2000); SELECT * FROM ddd; SELECT name,ddd.dept_name,ddd.dept_id,ddd.dept_leader FROM Personnel p JOIN ddd on p.dept_id = ddd.dept_id;
5、(2分)查找张三和李四所在部门所有人员的姓名。
答:
SELECT name from Personnel WHERE dept_id IN(SELECT p.dept_id FROM Personnel p WHERE p.name = '张三' AND p.name = '李四');
6、(3分)查看每个部门的部门经理和部门人数,按部门人数排序。
答:
CREATE TABLE aaa AS SELECT d.dept_id,COUNT(*) co FROM Personnel p JOIN Department d ON d.dept_id=p.dept_id SELECT d.dept_leader,a.co FROM Department d JOIN aaa a on a.dept_id = d.dept_id GROUP BY d.dept_id ORDER BY a.co
7、(2分)删除表Department 中的所有记录。
答:
DELETE Department
8、(2分)删除表 Department
答:
DROP TABLE Department
9、(2分)将Department表改名为 Department_bak。
rename table Department to Department_bak;