shell常见问题.docx_第1页
shell常见问题.docx_第2页
shell常见问题.docx_第3页
shell常见问题.docx_第4页
shell常见问题.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

非常好的十道Linuxshell脚本面试题1、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下#/bin/sh#Programm :# Using for move currently directory to /tmpfor FileName in ls -l | awk $510240 print $9domv $FileName /tmpdonels -al /tmpecho Done! 2、编写shell脚本获取本机的网络地址。比如:本机的ip地址是:/,那么它的网络地址是/方法一:#!/bin/bash#This script print ip and networkfile=/etc/sysconfig/network-scripts/ifcfg-eth0if -f $file ;thenIP=grep IPADDR $file|awk -F= print $2 MASK=grep NETMASK $file|awk -F= print $2 echo $IP/$MASKexit 1fi方法二:#!/bin/bash#This programm will printf ip/network#IP=ifconfig eth0 |grep inet |sed s/.*addr:/g|sed s/ Bcast.*$/gNETMASK=ifconfig eth0 |grep inet |sed s/.*Mask:/gecho $IP/$NETMASKexit3、用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。参考程序:#!/bin/shFILENAME=echo “Input file name:”read FILENAMEif -c $FILENAME thencp $FILENAME /devfi4请为下列shell程序添加注释,并说明程序的功能和调用方法:#!/bin/sh# /etc/rc.d/rc.httpd# Start/stop/restart the Apache web server.# To make Apache start automatically at boot, make this# file executable: chmod 755 /etc/rc.d/rc.httpd#case $1 instart)/usr/sbin/apachectl start ;stop)/usr/sbin/apachectl stop ;restart)/usr/sbin/apachectl restart ;*)echo usage $0 start|stop|restart ;esac参考答案:(1)程序注释#!/bin/sh 定义实用的shell# /etc/rc.d/rc.httpd 注释行,凡是以星号开始的行均为注释行。# Start/stop/restart the Apache web server.# To make Apache start automatically at boot, make this# file executable: chmod 755 /etc/rc.d/rc.httpd#case $1 in #case结构开始,判断“位置参数”决定执行的操作。本程序携带一个“位置参数”,即$1start) #若位置参数为start/usr/sbin/apachectl start ; #启动httpd进程stop) #若位置参数为stop/usr/sbin/apachectl stop ; #关闭httpd进程restart) #若位置参数为stop/usr/sbin/apachectl restart ; #重新启动httpd进程*) #若位置参数不是start、stop或restart时echo usage $0 start|stop|restart ; #显示命令提示信息:程序的调用方法esac #case结构结束(2)程序的功能是启动,停止或重新启动httpd进程(3)程序的调用方式有三种:启动,停止和重新启动。5设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。参考答案:#!/bin/shi=1groupadd class1while $i -le 30 doif $i -le 9 ;thenUSERNAME=stu0$ielseUSERNAME=stu$ifiuseradd $USERNAMEmkdir /home/$USERNAMEchown -R $USERNAME /home/$USERNAMEchgrp -R class1 /home/$USERNAMEi=$($i+1)done6编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。参考程序:#!/bin/shi=1while $i -le 50 douserdel -r stud$ii=$($i+1 )done7某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案 :(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前开机后启动。参考答案:解决方案:(1)用vi创建编辑一个名为prgx的crontab文件;prgx文件的内容:50 16 * * * rm -r /abc/*(2)、0 8-18/1 * * * cut -f1 /xyz/x1 ; /backup/bak01.txt(3)、50 17 * * * tar zcvf backup.tar.gz /data(4)、55 17 * * * umount /dev/hdc(5)、由超级用户登录,用crontab执行 prgx文件中的内容:rootxxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。8设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。参考答案:(1)编写shell程序fileback:#!/bin/shDIRNAME=ls /root | grep bakif -z $DIRNAME ; thenmkdir /root/bakcd /root/bakfiYY=date +%yMM=date +%mDD=date +%dBACKETC=$YY$MM$DD_etc.tar.gztar zcvf $BACKETC /etcecho fileback finished!(2)编写任务定时器:echo 0 0 1 * * /bin/sh /usr/bin/fileback ; /root/etcbakcroncrontab /root/etcbakcron或使用crontab -e 命令添加定时任务:0 1 * * * /bin/sh /usr/bin/fileback9有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?参考答案:(1)第一种方法:用户应使用crontab e 命令创建crontab文件。格式如下:0 0 * * sun cp r /user/backup /tmp(2)第二种方法:用户先在自己目录下新建文件file,文件内容如下:0 * * sun cp r /user/backup /tmp然后执行 crontab file 使生效。10设计一个Shell程序,在/userdata目录下建立50个目录,即user1user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。参考答案: 建立程序 Pro16如下:#!/bin/shi=1while i -le 50 doif -d /userdata ;thenmkdir -p -m 754 /userdata/user$i 加上-m 754 就不用写下面那一句了 -p 是递归建立目录#chmod 754 /userdata/user$iecho user$ilet i = i + 1 (或i=$($i+1)elsemkdir /userdatamkdir -p -m /userdata/user$i#chmod 754 /userdata/user$iecho user$ilet i = i + 1 (或i=$($i1)fidone1) 如何向脚本传递参数 ?./script argument例子 : 显示文件名称脚本./show.sh file1.txtcat show.sh#!/bin/bashcat $12) 如何在脚本中使用参数 ?第一个参数 : $1,第二个参数 : $2例子 : 脚本会复制文件(arg1) 到目标地址(arg2)./copy.sh file1.txt /tmp/cat copy.sh#!/bin/bashcp $1 $23) 如何计算传递进来的参数 ?$#4) 如何在脚本中获取脚本名称 ?$05) 如何检查之前的命令是否运行成功 ?$?6) 如何获取文件的最后一行 ?tail -17) 如何获取文件的第一行 ?head -18) 如何获取一个文件每一行的第三个元素 ?awk print $39) 假如文件中每行第一个元素是 FIND,如何获取第二个元素awk if ($1 = FIND) print $210) 如何调试 bash 脚本将 -xv 参数加到 #!/bin/bash 后例子:#!/bin/bash xv11) 举例如何写一个函数 ?function example echo Hello world!12) 如何向连接两个字符串 ?V1=HelloV2=WorldV3=$V1$V2echo $V3输出HelloWorld13) 如何进行两个整数相加 ?V1=1V2=2let V3=$V1+$V2echo $V3输出3据 kashu 的意见,本题的更佳回答为:两个整数相加,还有若干种方法实现:A=5B=6echo $($A+$B) # 方法 2echo $A+$B # 方法 3expr $A + $B # 方法 4echo $A+$B | bc # 方法 5awk BEGINprint $A+$B # 方法 614) 如何检查文件系统中是否存在某个文件 ?if -f /var/log/messages thenecho File existsfi15) 写出 shell 脚本中所有循环语法 ?for 循环 :for i in $( ls ); doecho item: $idonewhile 循环 :#!/bin/bashCOUNTER=0while $COUNTER -lt 10 ; doecho The counter is $COUNTERlet COUNTER=COUNTER+1doneuntil 循环 :#!/bin/bashCOUNTER=20until $COUNTER -lt 10 ; doecho COUNTER $COUNTERlet COUNTER-=1done16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?这一行说明要使用的 shell。#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。(LCTT译注:这一行称之为释伴行。)17) 如何获取文本文件的第 10 行 ?head -10 file|tail -118) bash 脚本文件的第一个符号是什么#19) 命令: -z & echo 0 | echo 1 的输出是什么020) 命令 “export” 有什么用 ?使变量在子 shell 中可用。21) 如何在后台运行脚本 ?在脚本后面添加 “&”。据 kashu 的意见,更好的答案是:nohup command &大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &没了.22) chmod 500 script 做什么 ?使脚本所有者拥有可执行权限。23) 做什么 ?重定向输出流到文件或另一个流。24) & 和 & 有什么区别 & - 希望脚本在后台运行的时候使用它 & - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它25) 什么时候要在 condition 之前使用 “if” ?当条件满足时需要运行多条命令的时候。26) 命令: name=John & echo My name is $name 的输出是什么My name is $name27) bash shell 脚本中哪个符号用于注释 ?#28) 命令: echo $new:-variable 的输出是什么variable29) 和 引号有什么区别 ? - 当我们不希望把变量转换为值的时候使用它。 - 会计算所有变量的值并用值代替。30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ?在脚本文件中添加 exec log.txt 2&1 命令。31) 如何只用 echo 命令获取字符串变量的一部分 ?echo $variable:x:yx - 起始位置y - 长度例子:variable=My name is Petras, and I am developer.echo $variable:11:6 # 会显示 Petras32) 如果给定字符串 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: $3100 /etc/passwd35) 写程序为用户计算主组数目并显示次数和组名cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c gdo echo $c; grep :$g: /etc/group|cut -d: -f1;|xargs -n 2done36) 如何在 bash shell 中更改标准的域分隔符为 : ?IFS=:37) 如何获取变量长度 ?$#variable38) 如何打印变量的最后 5 个字符 ?echo $variable: -539) $variable:-10 和 $variable: -10 有什么区别? $variable:-10 - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量 $variable: -10 - 输出 variable 的最后 10 个字符40) 如何只用 echo 命令替换字符串的一部分 ?echo $variable/pattern/replacement41) 哪个命令将命令替换为大写 ?tr :lower: :upper:42) 如何计算本地用户数目 ?wc -l /etc/passwd|cut -d -f1 或者 cat /etc/passwd|wc -l43) 不用 wc 命令如何计算字符串中的单词数目 ?set $stringecho $#44) export $variable 或 export variable 哪个正确 ?export variable45) 如何列出第二个字母是 a 或 b 的文件 ?ls -d ?ab*46) 如何将整数 a 加到 b 并赋值给 c ?c=$(a+b)或c=expr $a + $b或c=echo $a+$b|bc47) 如何去除字符串中的所有空格 ?echo $string|tr -d 48) 重写这个命令,将输出变量转换为复数: item=car; echo I like $item ?item=car; echo I like $items49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 )的命令 ?for i in 0.100.3; do echo $i; done或for ( i=0; i=100; i=i+3 ); do echo Welcome $i times; done50) 如何打印传递给脚本的所有参数 ?echo $*或echo $51) $a = $b 和 $a -eq $b 有什么区别 $a = $b - 用于字符串比较 $a -eq $b - 用于数字比较52) = 和 = 有什么区别 = - 用于为变量赋值 = - 用于字符串比较53) 写出测试 $a 是否大于 12 的命令 ? $a -gt 12 54) 写出测试 $b 是否小于等于 12 的命令 ? $b -le 12 55) 如何检查字符串是否以字母 abc 开头 ? $string = abc* 56) $string = abc* 和 $string = abc* 有什么区别 $string = abc* - 检查字符串是否以字母 abc 开头 $string = abc - 检查字符串是否完全等于 abc57) 如何列出以 ab 或 xy 开头的用户名 ?egrep ab|xy /etc/passwd|cut -d: -f158) bash 中 $! 表示什么意思 ?后台最近执行命令的 PID.59) $? 表示什么意思 ?前台最近命令的结束状态。60) 如何输出当前 shell 的 PID ?echo $61) 如何获取传递给脚本的参数数目 ?echo $#(LCTT 译注:和第3题重复了。)62) $* 和 $ 有什么区别 $* - 以一个字符串形式输出所有传递到脚本的参数 $ - 以 $IFS 为分隔符列出所有传递到脚本中的参数63) 如何在 bash 中定义数组 ?array=(Hi my name is)64) 如何打印数组的第一个元素 ?echo $array065) 如何打印数组的所有元素 ?echo $array66) 如何输出所有数组索引 ?echo $!array67) 如何移除数组中索引为 2 的元素 ?unset array268) 如何在数组中添加 id 为 333 的元素 ?array333=New_element69) shell 脚本如何获取输入的值 ?a) 通过参数./script param1 param2b) 通过 read 命令read -p Destination backup Server : desthost70) 在脚本中如何使用 expect ?/usr/bin/expect EODspawn rsync -ar $line $desthost:$destpathexpect *?assword:*send $passwordrexpect eofEOD1、用sed修改test.txt的23行test为tset; sedi 23s/test/tset/g test.txt2、查看/web.log第25行第三列的内容。 sedn 25p /web.log | cut d “ ” f3 headn25 /web.log | tail n1 | cut d “ ” f3 awkF “ ” NR=23print $3 /web.log3、删除每个临时文件的最初三行。 sedi 1,3d /tmp/*.tmp4、脚本编程:求100内的质数。 #!/bin/bash i=1 while $i -le 100 ;do ret=1 for( j=2;j /etc/crontab6、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下 #!/bin/bash fileinfo=($(du./*) length=$#fileinfo for(i=0;i /etc/crontab9、在shell环境如何杀死一个进程? psaux | grep | cut -f?得到pid cat/proc/pid killpid10、在shell环境如何查找一个文件? find/ -name abc.txt11、在shell里如何新建一个文件? touch/newfile.txt12、Linux下面的sed和awk的编写1)如何显示文本file.txt中第二大列大于56789的行? awk -F , if($256789)print $0 file.txt2)显示file.txt的1,3,5,7,10,15行? sed -n 1p;3p;5p;7p;10p;15p file.txt awk NR=1|NR=3|NR=5|NR=15print $0 file.txt3)将file.txt的制表符,即tab,全部替换成| sed-i s#t#|#g file.txt13、把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell” #!/bin/bash str=find./ -name *.sh fori in $str do mv$i $i%shshell done14、编写shell实现自动删除50个账号功能,账号名为stud1至stud50 #!/bin/bash for(i=1;i=50;i+);do userdel stud$i done15、请用Iptables写出只允许79访问本服务器的22端口。 /sbin/iptables -A input -p tcp -dport 22 -s 79 -j ACCEPT /sbin/iptables -A input -p udp -dport 22 -s 79 -j ACCEPT /sbin/iptables -P input -j DROP1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论