Shell 高频面试题及详细答案(实战版)_第1页
Shell 高频面试题及详细答案(实战版)_第2页
Shell 高频面试题及详细答案(实战版)_第3页
Shell 高频面试题及详细答案(实战版)_第4页
Shell 高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

Shell高频面试题及详细答案(实战版)一、Shell基础概念题1、什么是Shell?Shell和Bash的区别?答案:Shell是操作系统的命令行解释器,是用户和内核之间的交互桥梁,负责接收用户命令、翻译并提交给内核执行,同时支持脚本编程。区别:Shell是统称,包含sh、bash、zsh、csh等多种解释器;Bash是Linux系统默认的Shell,兼容sh语法,扩展了数组、函数、正则、快捷键等功能,日常运维编写的脚本基本都是Bash脚本。2、Linux中Shell脚本的执行方式有哪些?区别是什么?答案:常见四种执行方式:shtest.sh/bashtest.sh:新开子Shell执行,无需脚本加执行权限,不继承当前终端环境变量修改;./test.sh:新开子Shell执行,必须加执行权限(chmod+x),标准脚本执行方式;sourcetest.sh/.test.sh:当前Shell执行,不开启子进程,脚本中修改的环境变量、切换目录会对当前终端生效;直接把脚本内容丢终端执行:临时生效,不推荐用于正式脚本。核心区别:是否开启子进程,是否影响当前终端环境。3、Shell脚本中#!/bin/bash的作用是什么?答案:脚本第一行的解释器声明,用于指定该脚本由bash解释器执行。系统在运行脚本时,会根据该声明调用对应的解释器解析脚本语法,不加该行时,系统默认用当前终端Shell执行,可能出现语法兼容报错。二、变量与参数面试题1、Shell中局部变量、全局变量、环境变量的区别?答案:局部变量:仅在当前脚本/函数内生效,函数执行结束销毁,直接定义a=1即为局部变量;全局变量:脚本内全程生效,默认所有直接定义的变量都是全局变量,子Shell无法继承;环境变量:通过export声明,可继承到子Shell、子进程,全局生效,常用于系统配置、程序路径配置。2、Shell脚本中$0、$1、$#、$*、$@、$?、$$分别代表什么?答案:$0:脚本本身的文件名;$1-$9:脚本的第1到第9个位置参数;$#:脚本传入的参数总个数;$*:所有传入参数,视为单个字符串,参数整体打包;$@:所有传入参数,视为独立数组,每个参数单独区分(循环遍历优先用$@);$?:上一条命令的执行返回状态码,0代表执行成功,非0代表失败;$$:当前脚本运行的进程PID。3、$*和$@的核心差异,举实战例子说明答案:核心差异:参数解析方式不同,带空格参数时差异最明显。假设传入参数:./test.sh123"456789"$*:将所有参数合并为一个整体,遍历只会读取1个整体字符串;$@:保留参数原有分隔,能正确识别带空格的独立参数,遍历会读取2个参数。实战中循环遍历参数一律用$@,避免参数空格导致逻辑异常。三、条件判断与循环面试题1、Shell中[]、[[]]、(())的区别?答案:[]:传统test命令,兼容所有Shell,语法严格,变量必须加双引号,不支持正则、||&&直接判断,仅支持简单字符串、文件判断;[[]]:Bash扩展语法,更安全,支持正则匹配、字符串模糊判断,支持&&||逻辑运算,变量不用强制加引号,日常脚本优先使用;(()):专门用于数值运算、数字比较,支持加减乘除、大于小于等于,无需$取值,不用-gt/-lt等参数,写法更简洁。2、常用的文件判断参数有哪些?答案:-f:判断是否为普通文件且存在;-d:判断是否为目录且存在;-e:判断文件/目录是否存在;-r:判断文件是否有可读权限;-w:判断文件是否有可写权限;-x:判断文件是否有可执行权限;-s:判断文件存在且非空(大小大于0)。3、for、while、until循环的使用场景及区别答案:for循环:适用于已知循环次数/遍历对象,比如遍历文件、遍历参数、遍历数组;while循环:适用于条件满足持续循环,常用读取文件内容、等待服务启动、轮询监控;until循环:与while相反,条件不满足时循环,条件满足停止,使用场景较少,多用于等待异常恢复。四、常用命令与正则实战题1、grep、sed、awk三者的分工是什么?答案:运维三剑客,各司其职,不混用:grep:核心是过滤查找,只负责筛选匹配的行,不修改、不处理字段;sed:核心是行处理,擅长对整行内容替换、删除、插入、修改文本,流式逐行处理;awk:核心是列处理、数据统计,擅长分割字段、提取指定列、求和、计数、格式化输出,适合结构化文本(日志、配置文件)。2、简述Shell管道|和重定向>、>>、2>、&>区别答案:|:管道,将前一条命令的标准输出作为后一条命令的输入;>:标准输出重定向,覆盖写入文件,清空原有内容;>>:标准输出追加重定向,在文件末尾追加内容,不覆盖;2>:错误输出重定向,将命令报错信息写入文件;&>:标准输出+错误输出全部重定向,统一写入同一个文件。3、如何清空一个大文件?有几种方式,优缺点是什么?答案:推荐两种安全方式,不推荐rm-rf直接删正在使用的日志文件:>test.log:最简方式,直接清空文件,不改变文件句柄,服务不中断;echo"">test.log:清空后保留空行,适合部分解析严格的日志文件;避坑点:正在写入的日志文件,用rm删除后,磁盘空间不会立即释放,必须重启服务或清空句柄。五、脚本实战与故障排查题(高频面试)1、Shell脚本中set-e、set-u、set-opipefail作用?答案:生产脚本必备参数,用于严格报错,避免脚本异常静默执行:set-e:命令执行失败时,直接退出脚本,不会继续执行后续逻辑;set-u:使用未定义变量时,直接报错退出,避免空变量导致逻辑异常;set-opipefail:管道命令中任意一段失败,整体判定为失败,默认管道只看最后一条命令返回值。生产脚本开头一般统一配置:set-euopipefail2、为什么尽量不要用root运行Shell脚本?答案:root拥有最高权限,脚本一旦出现误删、误替换、递归操作,会直接破坏系统文件、配置、数据,无法挽回。规范做法:普通用户执行,需要高权限的单独配置sudo授权,最小权限原则,降低风险。3、脚本执行报错:syntaxerrornearunexpectedtoken`fi'是什么原因?答案:典型语法错误,高频原因:if语句未闭合,漏写fi;if后[]前后缺少空格;Windows编辑脚本上传Linux,存在换行符\r\n兼容问题(可通过dos2unix修复);循环、判断语句嵌套混乱。4、如何调试Shell脚本?答案:三种常用调试方式:局部调试:脚本内需要调试的位置加set-x,开启打印执行过程,set+x关闭;全局调试:执行脚本时加参数bash-xtest.sh,逐行打印执行细节、变量取值;错误排查:结合set-euopipefail严格报错,快速定位异常行。六、手写脚本真题(面试必考)1、手写脚本:判断文件是否存在,不存在则创建,存在则追加写入一行日志参考答案:PlainText

#!/bin/bash

set-euopipefail

log_file="./test.log"

#判断文件不存在则创建

if[!-f"${log_file}"];then

touch"${log_file}"

fi

#追加日志

echo"$(date+%Y-%m-%d\%H:%M:%S)脚本执行成功">>"${log_file}"2、手写脚本:遍历当前目录所有文件,统计普通文件和目录数量参考答案:PlainText

#!/bin/bash

set-euopipefail

file_num=0

dir_num=0

forfilein$(ls./);do

if[-f"${file}"];then

((file_num++))

elif[-d"${file}"];then

((dir_num++))

fi

done

echo"普通文件数量:${file_num}"

echo"目录数量:${dir_num}"3、手写脚本:监控Nginx状态,挂掉则自动重启参考答案:PlainText

#!/bin/bash

set-euopipefail

#检查Nginx进程

nginx_status=$(ps

温馨提示

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

评论

0/150

提交评论