shell常见问题.docx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 常见问题
- 资源描述:
-
非常好的十道Linux shell脚本面试题 1、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下 #/bin/sh #Programm : # Using for move currently directory to /tmp for FileName in `ls -l | awk '$5>10240 {print $9}'` do mv $FileName /tmp done ls -al /tmp echo "Done! " 2、编写shell脚本获取本机的网络地址。 比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是 192.168.100.1/255.255.255.0 方法一: #!/bin/bash #This script print ip and network 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" exit 1 fi 方法二: #!/bin/bash #This programm will printf ip/network # IP=`ifconfig eth0 |grep 'inet ' |sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'` NETMASK=`ifconfig eth0 |grep 'inet '|sed 's/^.*Mask://g'` echo "$IP/$NETMASK" exit 3、用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。 参考程序: #!/bin/sh FILENAME= echo “Input file name:” read FILENAME if [ -c "$FILENAME" ] then cp $FILENAME /dev fi 4.请为下列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" in 'start') /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结构开始,判断“位置参数”决定执行的操作。本程序携带一个“位置参数”,即$1 'start') #若位置参数为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/sh i=1 groupadd class1 while [ $i -le 30 ] do if [ $i -le 9 ] ;then USERNAME=stu0${i} else USERNAME=stu${i} fi useradd $USERNAME mkdir /home/$USERNAME chown -R $USERNAME /home/$USERNAME chgrp -R class1 /home/$USERNAME i=$(($i+1)) done 6.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。 参考程序: #!/bin/sh i=1 while [ $i -le 50 ] do userdel -r stud${i} i=$(($i+1 )) done 7.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案 : (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文件中的内容: root@xxx:#crontab prgx;在每日早晨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 | grep bak` if [ -z "$DIRNAME" ] ; then mkdir /root/bak cd /root/bak fi YY=`date +%y` MM=`date +%m` DD=`date +%d` BACKETC=$YY$MM$DD_etc.tar.gz tar zcvf $BACKETC /etc echo "fileback finished!" (2)编写任务定时器: echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron crontab /root/etcbakcron 或使用crontab -e 命令添加定时任务: 0 1 * * * /bin/sh /usr/bin/fileback 9.有一普通用户想在每周日凌晨零点零分定期备份/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个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。 参考答案: 建立程序 Pro16如下: #!/bin/sh i=1 while [ i -le 50 ] do if [ -d /userdata ];then mkdir -p -m 754 /userdata/user$i 加上-m 754 就不用写下面那一句了 -p 是递归建立目录 #chmod 754 /userdata/user$i echo "user$i" let "i = i + 1" (或i=$(($i+1)) else mkdir /userdata mkdir -p -m /userdata/user$i #chmod 754 /userdata/user$i echo "user$i" let "i = i + 1" (或i=$(($i+1)) fi done 1) 如何向脚本传递参数 ? ./script argument 例子 : 显示文件名称脚本 ./show.sh file1.txt cat show.sh #!/bin/bash cat $1 2) 如何在脚本中使用参数 ? 第一个参数 : $1,第二个参数 : $2 例子 : 脚本会复制文件(arg1) 到目标地址(arg2) ./copy.sh file1.txt /tmp/ cat copy.sh #!/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) 举例如何写一个函数 ? function example { echo "Hello world!" } 12) 如何向连接两个字符串 ? V1="Hello" V2="World" V3=${V1}${V2} echo $V3 输出 HelloWorld 13) 如何进行两个整数相加 ? V1=1 V2=2 let V3=$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 "File exists" fi 15) 写出 shell 脚本中所有循环语法 ? for 循环 : for i in $( ls ); do echo item: $i done while 循环 : #!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done until 循环 : #!/bin/bash COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done 16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ? 这一行说明要使用的 shell。#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。(LCTT译注:这一行称之为释伴行。) 17) 如何获取文本文件的第 10 行 ? head -10 file|tail -1 18) bash 脚本文件的第一个符号是什么 # 19) 命令:[ -z "" ] && echo 0 || echo 1 的输出是什么 0 20) 命令 “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 $name 27) bash shell 脚本中哪个符号用于注释 ? # 28) 命令: echo ${new:-variable} 的输出是什么 variable 29) ' 和 " 引号有什么区别 ? · ' - 当我们不希望把变量转换为值的时候使用它。 · " - 会计算所有变量的值并用值代替。 30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ? 在脚本文件中添加 "exec >log.txt 2>&1" 命令。 31) 如何只用 echo 命令获取字符串变量的一部分 ? echo ${variable:x:y} x - 起始位置 y - 长度 例子: variable="My name is Petras, and I am developer." 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|while read c g do { echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2 done 36) 如何在 bash shell 中更改标准的域分隔符为 ":" ? IFS=":" 37) 如何获取变量长度 ? ${#variable} 38) 如何打印变量的最后 5 个字符 ? echo ${variable: -5} 39) ${variable:-10} 和 ${variable: -10} 有什么区别? · ${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量 · ${variable: -10} - 输出 variable 的最后 10 个字符 40) 如何只用 echo 命令替换字符串的一部分 ? echo ${variable//pattern/replacement} 41) 哪个命令将命令替换为大写 ? tr '[:lower:]' '[:upper:]' 42) 如何计算本地用户数目 ? wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l 43) 不用 wc 命令如何计算字符串中的单词数目 ? set ${string} echo $# 44) "export $variable" 或 "export variable" 哪个正确 ? export variable 45) 如何列出第二个字母是 a 或 b 的文件 ? ls -d ?[ab]* 46) 如何将整数 a 加到 b 并赋值给 c ? c=$((a+b)) 或 c=`expr $a + $b` 或 c=`echo "$a+$b"|bc` 47) 如何去除字符串中的所有空格 ? echo $string|tr -d " " 48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item" ? item="car"; echo "I like ${item}s" 49) 写出输出数字 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"; done 50) 如何打印传递给脚本的所有参数 ? 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" ]] - 检查字符串是否完全等于 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 的元素 ? unset array[2] 68) 如何在数组中添加 id 为 333 的元素 ? array[333]="New_element" 69) shell 脚本如何获取输入的值 ? a) 通过参数 ./script param1 param2 b) 通过 read 命令 read -p "Destination backup Server : " desthost 70) 在脚本中如何使用 "expect" ? /usr/bin/expect << EOD spawn rsync -ar ${line} ${desthost}:${destpath} expect "*?assword:*" send "${password}\r" expect eof EOD 1、用sed修改test.txt的23行test为tset; sed–i ‘23s/test/tset/g’ test.txt 2、查看/web.log第25行第三列的内容。 sed–n ‘25p’ /web.log | cut –d “ ” –f3 head–n25 /web.log | tail –n1 | cut –d “ ” –f3 awk–F “ ” ‘NR==23{print $3}’ /web.log 3、删除每个临时文件的最初三行。 sed–i ‘1,3d’ /tmp/*.tmp 4、脚本编程:求100内的质数。 #!/bin/bash i=1 while[ $i -le 100 ];do ret=1 for(( j=2;j<$i;j++ ));do if [ $(($i%$j))-eq 0 ];then ret=0 break fi done if[ $ret -eq 1 ];then echo-n "$i " fi i=$((i+1 )) done 5、晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令 echo1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab 6、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下 #!/bin/bash fileinfo=($(du./*)) length=${#fileinfo[@]} for((i=0;i<$length;i=$((i+2 ))));do if[ ${fileinfo[$i]} -le 10 ];then mv ${fileinfo[$((i+1 ))]} /tmp fi done 7、如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1 /sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080 /sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080 8、在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现 echo"1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab" 9、在shell环境如何杀死一个进程? psaux | grep | cut -f? 得到pid cat/proc/pid killpid 10、在shell环境如何查找一个文件? find/ -name abc.txt 11、在shell里如何新建一个文件? touch~/newfile.txt 12、Linux下面的sed和awk的编写 1)如何显示文本file.txt中第二大列大于56789的行? awk -F "," '{if($2>56789){print $0}}' file.txt 2)显示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=15{print $0}' file.txt 3)将file.txt的制表符,即tab,全部替换成"|" sed-i "s#\t#\|#g" file.txt 13、把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell” #!/bin/bash str=`find./ -name \*.sh` fori in $str do mv$i ${i%sh}shell done 14、编写shell实现自动删除50个账号功能,账号名为stud1至stud50 #!/bin/bash for((i=1;i<=50;i++));do userdel stud$i done 15、请用Iptables写出只允许10.1.8.179 访问本服务器的22端口。 /sbin/iptables -A input -p tcp -dport 22 -s 10.1.8.179 -j ACCEPT /sbin/iptables -A input -p udp -dport 22 -s 10.1.8.179 -j ACCEPT /sbin/iptables -P input -j DROP 16、在shell中变量的赋值有四种方法,其中,采用name=12的方法称( A )。 A直接赋值 B使用read命令 C使用命令行参数 D使用命令的输出 17、有文件file1 1)查询file1里面空行的所在行号 grep -n ^$ file1 2)查询file1以abc结尾的行 grep abc$ file1 3)打印出file1文件第1到第三行 head -n3 file1 sed "3q" file1 sed -n "1,3p" file1 18、假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令 1)将shutdown字符串全部替换成reboot :%s/shutdown/reboot/g 2)清空所有字符 :%d 3)不保存退出 q! 19、1到10数字相加,写出shell脚本 #!/bin/bash j=0 for((i=1;i<=10;i++));do j=$[j+i ] done echo $j 20、常见shell有哪些?缺省的是哪个? /bin/sh /bin/bash /bin/ash /bin/bsh /bin/csh /bin/tcsh /sbin/nologin 21、Shell循环语句有哪些? for while until 22、用SHELL模拟LVS,脚本怎么写 /sbin/iptable -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to192.168.1.11-192.168.1.12 23、找出系统内大于50k,小于100k的文件,并删除它们。 #!/bin/bash file=`find / -size +50k -size -100k` for i in $file;do rm -rf $i done 24、脚本(如:目录dir1、dir2、dir3下分别有file1、file2、file2,请使用脚本将文件改为dir1_file1、dir2_file2、dir3_file3) #!/bin/bash file=`ls dir[123]/file[123]` for i in $file;do mv $i ${i%/*}/${i%%/*}_${i##*/} done 25、将A 、B、C目录下的文件A1、A2、A3文件,改名为AA1、AA2、AA3.使用shell脚本实现。 #!/bin/bash file=`ls [ABC]/A[123]` for i in $file;do mv $i ${i%/*}/A${i#*/} done展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




shell常见问题.docx



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/12004486.html