非常好的12道shell命令经典面试问题
如下是一些面试过程中,经常会遇到的shell脚本面试问题及解答。
了解脚本或至少知道基础知识对测试工程师来说至关重要,它也有助于你在工作环境中自动完成很多任务。
你会发现,现在多数的测试工程师招聘要求中,都需要linux基础技能,及基本的Shell脚本技能。
如下是一些常见的Shell脚本面试问题。
1.文本分析
取出password中shell出现的次数
第一种方法结果:
4/bin/bash
1/bin/sync
1/sbin/halt
31/sbin/nologin
1/sbin/shutdown
第二种方法结果:
/bin/sync 1
/bin/bash 1
/sbin/nologin 30
/sbin/halt 1
/sbin/shutdown 1
2.文件整理
employee文件中记录了工号和姓名
employee.txt:
100JasonSmith
200JohnDoe
300SanjayGupta
400AshokSharma
bonus文件中记录工号和工资
bonus.txt:
100$5,000
200$500
300$3,000
400$1,250
要求把两个文件合并并输出如下
处理结果:
400ashoksharma$1,250
100jasonsmith $5,000
200johndoe $500
300sanjaygupta $3,000
3.打印本机的交换分区大小
处理结果:
Swap:1024M
4.用户清理
清除本机除了当前登陆用户以外的所有用户
处理结果:
23:00:17up 1:08, 1user, loadaverage:0.02,0.05,0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPUWHAT
root pts/1 192.168.1.100 22:15 0.00s10.75s 0.00sw
本机只剩下你自己就对了:)
5.root用户今天登陆了多长时间
处理结果:
rootlogontoday:0.06hour
6.打印当前sshd的端口和进程id
处理结果:
sshdPort&&pid:225412
7.输出本机创建20000个目录所用的时间
处理结果:
real 0m3.367s
user 0m0.066s
sys 0m1.925s
8.打印root可以使用可执行文件数
处理结果:
root'sbins:2306
9.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#/bin/sh #Programm: #Usingformovecurrentlydirectoryto/tmpforFileNamein`lsl|awk'$5>10240{print$9}'`do mv$FileName/tmpdonelsal/tmpecho"Done!"
10.编写shell脚本获取本机的网络地址。
比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是192.168.100.1/255.255.255.0
方法一:
#!/bin/bash #Thisscriptprintipandnetwork file="/etc/sysconfig/networkscripts/ifcfgeth0"if[f$file]then IP=`grep"IPADDR"$file|awkF"="'{print$2}'`MASK=`grep"NETMASK"$file|awkF"="'{print$2}'`echo"$IP/$MASK"exit1fi
11.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下。
参考程序:
#!/bin/shFILENAME= echo“Inputfilename:”readFILENAMEif[c"$FILENAME"]then cp$FILENAME/devfi
12.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
参考答案:
#!/bin/sh i=1 groupaddclass1while[$ile30]do if[$ile9]thenUSERNAME=stu0${i}else USERNAME=stu${i}fi useradd$USERNAMEmkdir/home/$USERNAME chownR$USERNAME/home/$USERNAMEchgrpRclass1/home/$USERNAMEi=$(($i+1))done
一些经典的Shell脚本面试问题
1.如何在脚本中使用参数?
第一个参数:$1,第二个参数:$2
例子:脚本会复制文件(arg1)到目标地址(arg2)
./copy.shfile1.txt/tmp/
catcopy.sh
#!/bin/bash
cp$1$2
2.如何计算传递进来的参数?
$#
3.如何检查之前的命令是否运行成功?
$?
4.如何获取文件的最后一行?
tail-1
5.如何获取文件的第一行?
head-1
6.如何获取一个文件每一行的第三个元素?
awk'{print$3}'
7.假如文件中每行第一个元素是FIND,如何获取第二个元素
awk'{if($1=="FIND")print$2}'
8.如何调试bash脚本
将-xv参数加到#!/bin/bash后
例子:
#!/bin/bash–xv
9.举例如何写一个函数?
functionexample{
echo"Helloworld!"
}
10.如何向连接两个字符串?
V1="Hello"
V2="World"
V3=${V1}${V2}
echo$V3
输出
HelloWorld
11.如何进行两个整数相加?
V1=1
V2=2
letV3=$V1+$V2
echo$V3
输出
3
12.如何检查文件系统中是否存在某个文件?
if[-f/var/log/messages]
then
echo"Fileexists"
fi
13.写出shell脚本中所有循环语法?
for循环:
foriin$(ls);do
echoitem:$i
done
while循环:
#!/bin/bash
COUNTER=0
while[$COUNTER-lt10];do
echoThecounteris$COUNTER
letCOUNTER=COUNTER+1
done
until循环:
#!/bin/bash
COUNTER=20
until[$COUNTER-lt10];do
echoCOUNTER$COUNTER
letCOUNTER-=1
done
14.每个脚本开始的#!/bin/sh或#!/bin/bash表示什么意思?
这一行说明要使用的shell。#!/bin/bash表示脚本使用/bin/bash。对于python脚本,就是#!/usr/bin/python。
15.如何获取文本文件的第10行?
head-10file|tail-1
16.bash脚本文件的第一个符号是什么
#
17.命令:[-z""]&&echo0||echo1的输出是什么
0
18.如何在后台运行脚本?
nohupcommand&
19."chmod500script"做什么?
使脚本所有者拥有可执行权限。
20. ">"做什么?
重定向输出流到文件或另一个流。
21.&和&&有什么区别
&-希望脚本在后台运行的时候使用它
&&-当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
22.bashshell脚本中哪个符号用于注释?
#
23.'和"引号有什么区别?
'-当我们不希望把变量转换为值的时候使用它。
"-会计算所有变量的值并用值代替。
24.如何在脚本文件中重定向标准输出和标准错误流到log.txt文件?
在脚本文件中添加"exec>log.txt2>&1"命令。
25.如何只用echo命令获取字符串变量的一部分?
echo${variable:x:y}
x-起始位置
y-长度
例子:
variable="MynameisPetras,andIamdeveloper."
echo${variable:11:6}#会显示Petras
26.如何使用awk列出UID小于100的用户?
awk-F:'$3<100'/etc/passwd
27.写程序为用户计算主组数目并显示次数和组名
cat/etc/passwd|cut-d:-f4|sort|uniq-c|whilereadcg
do
{echo$c;grep:$g:/etc/group|cut-d:-f1;}|xargs-n2
done
28.如何获取变量长度?
${#variable}
29.如何打印变量的最后5个字符?
echo${variable:-5}
30.如何只用echo命令替换字符串的一部分?
echo${variable//pattern/replacement}
31.如何计算本地用户数目?
wc-l/etc/passwd|cut-d""-f1或者cat/etc/passwd|wc-l
32.不用wc命令如何计算字符串中的单词数目?
set${string}
echo$#
33.如何列出第二个字母是a或b的文件?
ls-d?[ab]*
34.如何将整数a加到b并赋值给c?
c=$((a+b))
或
c=`expr$a+$b`
或
c=`echo"$a+$b"|bc`
35.如何去除字符串中的所有空格?
echo$string|tr-d""
36.写出输出数字0到100中3的倍数(0369…)的命令?
foriin{0..100..3};doecho$i;done
或
for((i=0;i<=100;i=i+3));doecho"Welcome$itimes";done
37.如何打印传递给脚本的所有参数?
echo$*
或
echo$@
38. [$a==$b]和[$a-eq$b]有什么区别
[$a==$b]-用于字符串比较
[$a-eq$b]-用于数字比较
39.=和==有什么区别
=-用于为变量赋值
==-用于字符串比较
40.写出测试$a是否大于12的命令?
[$a-gt12]
41.如何检查字符串是否以字母"abc"开头?
[[$string==abc*]]
42.[[$string==abc*]]和[[$string=="abc*"]]有什么区别
[[$string==abc*]]-检查字符串是否以字母abc开头
[[$string=="abc"]]-检查字符串是否完全等于abc
43.如何列出以ab或xy开头的用户名?
egrep"^ab|^xy"/etc/passwd|cut-d:-f1
44.bash中$!表示什么意思?
后台最近执行命令的PID.
45.$?表示什么意思?
前台最近命令的结束状态。
46.如何输出当前shell的PID?
echo$$
47.$*和$@有什么区别*
$*-以一个字符串形式输出所有传递到脚本的参数
$@-以$IFS为分隔符列出所有传递到脚本中的参数
48.如何在bash中定义数组?
array=("Hi""my""name""is")
49.如何打印数组的第一个元素?
echo${array[0]}
50.如何打印数组的所有元素?
echo${array[@]}
51.如何输出所有数组索引?
echo${!array[@]}
52.shell脚本如何获取输入的值?
a)通过参数
./scriptparam1param2
b)通过read命令
read-p"DestinationbackupServer:"desthost