shell常见问题.docx
- 文档编号:25179042
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:21
- 大小:22.61KB
shell常见问题.docx
《shell常见问题.docx》由会员分享,可在线阅读,更多相关《shell常见问题.docx(21页珍藏版)》请在冰豆网上搜索。
shell常见问题
非常好的十道Linuxshell脚本面试题
1、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#/bin/sh
#Programm:
#Usingformovecurrentlydirectoryto/tmp
forFileNamein`ls-l|awk'$5>10240{print$9}'`
do
mv$FileName/tmp
done
ls-al/tmp
echo"Done!
"
2、编写shell脚本获取本机的网络地址。
比如:
本机的ip地址是:
,那么它的网络地址是
方法一:
#!
/bin/bash
#Thisscriptprintipandnetwork
file="/etc/sysconfig/network-scripts/ifcfg-eth0"
if[-f$file];then
IP=`grep"IPADDR"$file|awk-F"="'{print$2}'`
MASK=`grep"NETMASK"$file|awk-F"="'{print$2}'`
echo"$IP/$MASK"
exit1
fi
方法二:
#!
/bin/bash
#Thisprogrammwillprintfip/network
#
IP=`ifconfigeth0|grep'inet'|sed's/^.*'s/Bcast.*$"$IP/$NETMASK"
exit
3、用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下。
参考程序:
#!
/bin/sh
FILENAME=
echo“Inputfilename:
”
readFILENAME
if[-c"$FILENAME"]
then
cp$FILENAME/dev
fi
4.请为下列shell程序添加注释,并说明程序的功能和调用方法:
#!
/bin/sh
#
#/etc/
#
#Start/stop/restarttheApachewebserver.
#
#TomakeApachestartautomaticallyatboot,makethis
#fileexecutable:
chmod755/etc/
#
case"$1"in
'start')
/usr/sbin/apachectlstart;;
'stop')
/usr/sbin/apachectlstop;;
'restart')
/usr/sbin/apachectlrestart;;
*)
echo"usage$0start|stop|restart";;
esac
参考答案:
(1)程序注释
#!
/bin/sh定义实用的shell
#
#/etc/注释行,凡是以星号开始的行均为注释行。
#
#Start/stop/restarttheApachewebserver.
#
#TomakeApachestartautomaticallyatboot,makethis
#fileexecutable:
chmod755/etc/
#
case"$1"in#case结构开始,判断“位置参数”决定执行的操作。
本程序携带一个“位置参数”,即$1
'start')#若位置参数为start
/usr/sbin/apachectlstart;;#启动httpd进程
'stop')#若位置参数为stop
/usr/sbin/apachectlstop;;#关闭httpd进程
'restart')#若位置参数为stop
/usr/sbin/apachectlrestart;;#重新启动httpd进程
*)#若位置参数不是start、stop或restart时
echo"usage$0start|stop|restart";;#显示命令提示信息:
程序的调用方法
esac#case结构结束
(2)程序的功能是启动,停止或重新启动httpd进程
(3)程序的调用方式有三种:
启动,停止和重新启动。
5.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
参考答案:
#!
/bin/sh
i=1
groupaddclass1
while[$i-le30]
do
if[$i-le9];then
USERNAME=stu0${i}
else
USERNAME=stu${i}
fi
useradd$USERNAME
mkdir/home/$USERNAME
chown-R$USERNAME/home/$USERNAME
chgrp-Rclass1/home/$USERNAME
i=$(($i+1))
done
6.编写shell程序,实现自动删除50个账号的功能。
账号名为stud1至stud50。
参考程序:
#!
/bin/sh
i=1
while[$i-le50]
do
userdel-rstud${i}
i=$(($i+1))
done
7.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4:
50删除/abc目录下的全部子目录和全部文件;
(2)从早8:
00~下午6:
00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的文件内;
(3)每逢星期一下午5:
50将/data目录下的所有目录和文件归档并压缩为文件:
;
(4)在下午5:
55将IDE接口的CD-ROM卸载(假设:
CD-ROM的设备名为hdc);
(5)在早晨8:
00前开机后启动。
参考答案:
解决方案:
(1)用vi创建编辑一个名为prgx的crontab文件;
prgx文件的内容:
5016***rm-r/abc/*
(2)、08-18/1***cut-f1/xyz/x1>;>;/backup/
(3)、5017***tarzcvf/data
(4)、5517***umount/dev/hdc
(5)、由超级用户登录,用crontab执行prgx文件中的内容:
root@xxx:
#crontabprgx;在每日早晨8:
00之前开机后即可自动启动crontab。
----------------------------------------------
8.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。
Shell程序fileback存放在/usr/bin目录下。
参考答案:
(1)编写shell程序fileback:
#!
/bin/sh
DIRNAME=`ls/root|grepbak`
if[-z"$DIRNAME"];then
mkdir/root/bak
cd/root/bak
fi
YY=`date+%y`
MM=`date+%m`
DD=`date+%d`
BACKETC=$YY$MM$zcvf$BACKETC/etc
echo"filebackfinished!
"
(2)编写任务定时器:
echo"001**/bin/sh/usr/bin/fileback">;/root/etcbakcron
crontab/root/etcbakcron
或使用crontab-e命令添加定时任务:
01***/bin/sh/usr/bin/fileback
9.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做
参考答案:
(1)第一种方法:
用户应使用crontab–e命令创建crontab文件。
格式如下:
00**suncp–r/user/backup/tmp
(2)第二种方法:
用户先在自己目录下新建文件file,文件内容如下:
0**suncp–r/user/backup/tmp
然后执行crontabfile使生效。
10.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:
读;文件所有者的权限为:
读、写、执行;文件所有者所在组的权限为:
读、执行。
参考答案:
建立程序Pro16如下:
#!
/bin/sh
i=1
while[i-le50]
do
if[-d/userdata];then
mkdir-p-m754/userdata/user$i加上-m754就不用写下面那一句了-p是递归建立目录
#chmod754/userdata/user$i
echo"user$i"
let"i=i+1"(或i=$(($i+1))
else
mkdir/userdata
mkdir-p-m/userdata/user$i
#chmod754/userdata/user$i
echo"user$i"
let"i=i+1"(或i=$(($i+1))
fi
done
1)如何向脚本传递参数
./scriptargument
例子:
显示文件名称脚本
./
cat
#!
/bin/bash
cat$1
2)如何在脚本中使用参数
第一个参数:
$1,第二个参数:
$2
例子:
脚本会复制文件(arg1)到目标地址(arg2)
.//tmp/
cat
#!
/bin/bash
cp$1$2
3)如何计算传递进来的参数
$#
4)如何在脚本中获取脚本名称
$0
5)如何检查之前的命令是否运行成功
$
6)如何获取文件的最后一行
tail-1
7)如何获取文件的第一行
head-1
8)如何获取一个文件每一行的第三个元素
awk'{print$3}'
9)假如文件中每行第一个元素是FIND,如何获取第二个元素
awk'{if($1=="FIND")print$2}'
10)如何调试bash脚本
将-xv参数加到#!
/bin/bash后
例子:
#!
/bin/bash–xv
11)举例如何写一个函数
functionexample{
echo"Helloworld!
"
}
12)如何向连接两个字符串
V1="Hello"
V2="World"
V3=${V1}${V2}
echo$V3
输出
HelloWorld
13)如何进行两个整数相加
V1=1
V2=2
letV3=$V1+$V2
echo$V3
输出
3
据@kashu的意见,本题的更佳回答为:
两个整数相加,还有若干种方法实现:
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
14)如何检查文件系统中是否存在某个文件
if[-f/var/log/messages]
then
echo"Fileexists"
fi
15)写出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
16)每个脚本开始的#!
/bin/sh或#!
/bin/bash表示什么意思
这一行说明要使用的shell。
#!
/bin/bash表示脚本使用/bin/bash。
对于python脚本,就是#!
/usr/bin/python。
(LCTT译注:
这一行称之为释伴行。
)
17)如何获取文本文件的第10行
head-10file|tail-1
18)bash脚本文件的第一个符号是什么
#
19)命令:
[-z""]&&echo0||echo1的输出是什么
0
20)命令“export”有什么用
使变量在子shell中可用。
21)如何在后台运行脚本
在脚本后面添加“&”。
据@kashu的意见,更好的答案是:
nohupcommand&
大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command&没了...
22)"chmod500script"做什么
使脚本所有者拥有可执行权限。
23)">"做什么
重定向输出流到文件或另一个流。
24)&和&&有什么区别
&-希望脚本在后台运行的时候使用它
&&-当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
25)什么时候要在[condition]之前使用“if”
当条件满足时需要运行多条命令的时候。
26)命令:
name=John&&echo'Mynameis$name'的输出是什么
Mynameis$name
27)bashshell脚本中哪个符号用于注释
#
28)命令:
echo${new:
-variable}的输出是什么
variable
29)'和"引号有什么区别
'-当我们不希望把变量转换为值的时候使用它。
"-会计算所有变量的值并用值代替。
30)如何在脚本文件中重定向标准输出和标准错误流到文件
在脚本文件中添加"exec>2>&1"命令。
31)如何只用echo命令获取字符串变量的一部分
echo${variable:
x:
y}
x-起始位置
y-长度
例子:
variable="MynameisPetras,andIamdeveloper."
echo${variable:
11:
6}#会显示Petras
32)如果给定字符串variable="User:
123:
321:
/home/dir",如何只用echo命令获取home_dir
echo${variable#*:
*:
*:
}
或
echo${variable##*:
}
33)如何从上面的字符串中获取“User”
echo${variable%:
*:
*:
*}
或
echo${variable%%:
*}
34)如何使用awk列出UID小于100的用户
awk-F:
'$3<100'/etc/passwd
35)写程序为用户计算主组数目并显示次数和组名
cat/etc/passwd|cut-d:
-f4|sort|uniq-c|whilereadcg
do
{echo$c;grep:
$g:
/etc/group|cut-d:
-f1;}|xargs-n2
done
36)如何在bashshell中更改标准的域分隔符为":
"
IFS=":
"
37)如何获取变量长度
${#variable}
38)如何打印变量的最后5个字符
echo${variable:
-5}
39)${variable:
-10}和${variable:
-10}有什么区别
${variable:
-10}-如果之前没有给variable赋值则输出10;如果有赋值则输出该变量
${variable:
-10}-输出variable的最后10个字符
40)如何只用echo命令替换字符串的一部分
echo${variable100..3};doecho$i;done
或
for((i=0;i<=100;i=i+3));doecho"Welcome$itimes";done
50)如何打印传递给脚本的所有参数
echo$*
或
echo$@
51)[$a==$b]和[$a-eq$b]有什么区别
[$a==$b]-用于字符串比较
[$a-eq$b]-用于数字比较
52)=和==有什么区别
=-用于为变量赋值
==-用于字符串比较
53)写出测试$a是否大于12的命令
[$a-gt12]
54)写出测试$b是否小于等于12的命令
[$b-le12]
55)如何检查字符串是否以字母"abc"开头
[[$string==abc*]]
56)[[$string==abc*]]和[[$string=="abc*"]]有什么区别
[[$string==abc*]]-检查字符串是否以字母abc开头
[[$string=="abc"]]-检查字符串是否完全等于abc
57)如何列出以ab或xy开头的用户名
egrep"^ab|^xy"/etc/passwd|cut-d:
-f1
58)bash中$!
表示什么意思
后台最近执行命令的PID.
59)$表示什么意思
前台最近命令的结束状态。
60)如何输出当前shell的PID
echo$$
61)如何获取传递给脚本的参数数目
echo$#
(LCTT译注:
和第3题重复了。
)
62)$*和$@有什么区别
$*-以一个字符串形式输出所有传递到脚本的参数
$@-以$IFS为分隔符列出所有传递到脚本中的参数
63)如何在bash中定义数组
array=("Hi""my""name""is")
64)如何打印数组的第一个元素
echo${array[0]}
65)如何打印数组的所有元素
echo${array[@]}
66)如何输出所有数组索引
echo${!
array[@]}
67)如何移除数组中索引为2的元素
unsetarray[2]
68)如何在数组中添加id为333的元素
array[333]="New_element"
69)shell脚本如何获取输入的值
a)通过参数
./scriptparam1param2
b)通过read命令
read-p"DestinationbackupServer:
"desthost
70)在脚本中如何使用"expect"
/usr/bin/expect< spawnrsync-ar${line}${desthost}: ${destpath} expect"*assword: *" send"${password}\r" expecteof EOD 1、用sed修改的23行test为tset; sed–i‘23s/test/tset/g’ 2、查看/第25行第三列的内容。 sed–n‘25p’/|cut–d“”–f3 head–n25/|tail–n1|cut–d“”–f3 awk–F“”‘NR==23{print$3}’/ 3、删除每个临时文件的最初三行。 sed–i‘1,3d’/tmp/*.tmp 4、脚本编程: 求100内的质数。 #! /bin/bash i=1 while[$i-le100];do ret=1 for((j=2;j<$i;j++));do if[$(($i%$j))-eq0];then ret=0 break fi done if[$ret-eq1];then echo-n"$i" fi i=$((i+1)) done 5、晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令 echo123,1-8/2***root/tmp/>>/etc/crontab 6、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下 #! /bin/bash fileinfo=($(du./*)) length=${#fileinfo[@]} for((i=0;i<$length;i=$((i+2))));do if[${fileinfo[$i]}-le10];then mv${fileinfo[$((i+1))]}/tmp fi done 7、如何将本地80端口的请求转发到8080端口,当前主机IP为/sbin/iptables-tnat-APREROUTING-ptcp--dport80-jDNAT--to/sbin/iptables-tnat-APREROUTING-ptcp--dport80-jREDIRECT--to8080 8、在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/怎么实现 echo"16-12/2***root/usr/bin/>>/etc/crontab" 9、在shell环境如何杀死一个进程 psaux|grep|cut-f得到pid cat/proc/pid killpid 10、在shell环境如何查找一个文件 find/-name 11、在shell里如何新建一个文件 touch~/ 12、Lin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 常见问题