Shell脚本周考习题及答案
一、Shell 脚本理论简答题(25 道,每题3分)
1.什么是Shell 脚本?在Linux运维中,它主要用于解决哪些实际问题?
Shell 脚本是一个包含一系列 Shell 命令的文本文件,用于自动化执行任务。在 Linux 运维中,它常用于:
自动化系统管理和监控;
批量处理文件或数据;
定时任务(如备份、日志清理);
服务启动/停止脚本;
系统初始化配置。
2.Shell脚本首行#/bin/bash的具体作用是什么?
该行称为 shebang,用于指定脚本的解释器为 /bin/bash,确保脚本使用 Bash 解释器执行。
3.执行 Shell 脚本时,./script.sh和source script.sh(或, script.sh)的核心区别是什么?运维中何时适合用后者?
./script.sh 在子 Shell 中执行,不影响当前 Shell 环境;
source script.sh 在当前 Shell 中执行,会改变当前环境变量。
适用场景:
需修改当前 Shell 环境时(如加载环境变量、别名等)。
4. 普通变量(局部变量)和环境变量在作用域上有何本质区别?在编写运维脚本时,如何根据需求选择使用哪种变量?
普通变量:仅当前 Shell 有效;
环境变量:当前 Shell 及其子进程有效。
选择建议:
若需在子进程中使用的变量(如 PATH、JAVA_HOME)应设为环境变量(用 export)。
5.运维中常用的环境变量有哪些(至少列举3个)?如何临时设置一个环境变量使其在当前 Shell 及子 Shell中生效?
常用环境变量:PATH、HOME、USER。
设置方法:export VAR_NAME=value
6.位置变量$1、$2、$0、$#、$?、$$在运维脚本中分别用于获取什么信息?请各举一个实际使用场景。
$1、$2:第1、2个参数;
$0:脚本名;
$#:参数个数;
$?:上一条命令的退出状态;
$$:当前进程 PID。
使用场景:
$1 用于接收文件名;
$? 用于判断命令是否成功。
7.在处理脚本参数时,$*和$@的行为有何不同?为什么运维中遍历参数时更推荐使用$@?
$* 将所有参数视为一个字符串;
$@ 将每个参数视为独立字符串。
推荐 $@:
便于遍历参数,避免空格引起的误解。
8.给Shell变量命名时需要遵守哪些基本规则?
由字母、数字、下划线组成;
不能以数字开头;
不能使用关键字(如 if、for)。
9.变量赋值时,单引号"和双引号""对变量引用的处理有何不同?运维中拼接包含变量的路径时应优先用哪种引号?
单引号:不解析变量;
双引号:解析变量。
路径拼接推荐用双引号,如:"${DIR}/file"。
10.在运维脚本中,如何快速获取一个字符串的长度?请写出具体方法,
${#string}
11.如何将两个变量的字符串内容拼接成一个新字符串?举一个运维中常见的拼接场景(如路径拼接)。
str3="${str1}${str2}"
12.简述$(string;start:length)在运维中的实际用途,比如如何从IP地址中截取网段部分。
用于截取子字符串。
例如从 192.168.1.10 中截取网段 192.168.1
${IP:0:10}
13. Shell 支持哪些常用的算术运算符?运维中如何处理浮点数计算需求?
运算符:+ - * / % **
浮点数计算需借助 bc 或 awk,如:
echo "scale=2; 10/3" | bc
14. 运维脚本中实现整数运算的常用方式有哪些(至少3种)?请分别举例。
let sum=1+2
sum=$((1+2))
sum=$[1+2]
15.什么是退出状态码?$?的含义是什么?运维脚本中如何利用$?判断上一条命令是否执行成功?
$? 表示上一条命令的退出状态(0 成功,非0 失败)。
示例:
command
if [ $? -eq 0 ]; then
echo "Success"
fi
16. 运维脚本中如何通过exit命令自定义退出状态码?
使用 exit n,如:exit 1
17.bash-x script.sh在脚本调试中起到什么作用?运维中何时需要使用这个命令?
用于调试脚本,显示每行命令及其执行结果。
适用于脚本逻辑错误或变量赋值问题时。
18.执行脚本时,子 Shell 环境与当前 Shell 环境有何隔离性?这对脚本中变量的生效范围有什么影响?
子 Shell 中定义的变量不会影响父 Shell,环境变量除外。
19.运维中如何删除一个已定义的变量?删除变量后,再次引用该变量会出现什么结果?
使用 unset var_name,删除后引用值为空。
20. Shell 中如何定义一个数组?
arr=(value1 value2 value3)
21.条件表达式中,-f、-d运算符分别用于判断文件的什么属性?请写出“判断 /var/log/messages 是普通文件且存在”的条件表达式。
-f:判断是否为普通文件;
-d:判断是否为目录。
条件表达式:[ -f "/var/log/messages" ]
22. 数值比较类条件运算符-eq、-ne、-gt、-It 分别表示什么含义?若要判断变量 disk_usage(存储磁盘使用率如85)大于80,对应的条件表达式是什么?
-eq:等于;-ne:不等于;-gt:大于;-lt:小于。
条件表达式:[ $disk_usage -gt 80 ]
23.cmd1 && cmd2 || cmd3 的执行逻辑是什么?请举例说明如何用该组合实现“备份文件成功则删除原文件,失败则输出错误信息”。
若 cmd1 成功则执行 cmd2,否则执行 cmd3。
示例:cp file.txt backup/ && rm file.txt || echo "Backup failed"
24.用awk处理/etc/passwd文件(格式:root:x:0:0:root:/root:/bin/bash)时,需提取"UID大于1000且登录Shell为/bin/bash”的用户名(第一字段)。
awk -F: '$3 > 1000 && $7 == "/bin/bash" {print $1}' /etc/passwd
25. 从/var/log/messages中提取所有“包含error或warn(不区分大小写)的日志杀目,并统计有多少条?请写出命令,
grep -iE "error|warn" /var/log/messages | wc -l
二、Shell脚本编程题(5道,每题5分)
1.编写一个脚本,接收用户输入的两个整数,计算并输出它们的和、差、积、商(取整数)。
脚本思路:
接收两个参数,分别用 $1 和 $2 表示,使用 expr 或 $(()) 进行计算。
#!/bin/bashecho "和: $(($1 + $2))"echo "差: $(($1 - $2))"echo "积: $(($1 * $2))"echo "商: $(($1 / $2))"
2.编写一个脚本,判断用户输入的文件是否存在,若存在则输出文件类型(普通文件、目录等),若不存在则提示“文件不存在”。
脚本思路:
使用 -f 判断普通文件,-d 判断目录。
#!/bin/bashif [ -f "$1" ]; thenecho "普通文件"elif [ -d "$1" ]; thenecho "目录"elseecho "文件不存在"fi
3.编写一个脚本,批量创建10个用户(user1到user10),并设置初始密码为123456,创建完成后提示“用户创建完成”。
脚本思路:
使用 for 循环创建用户,useradd 添加用户,echo "123456" | passwd --stdin 设置密码。
#!/bin/bashfor i in {1..10}; douseradd user$iecho "123456" | passwd --stdin user$idoneecho "用户创建完成"
4.编写一个脚本,统计指定目录下普通文件的数量,并输出文件名包含“log”的文件列表。
脚本思路:
使用 find 查找普通文件并计数,再用 grep 过滤含 “log” 的文件。
#!/bin/bashcount=$(find $1 -type f | wc -l)echo "普通文件数量: $count"echo "含 log 的文件:"find $1 -type f -name "*log*"
5.编写一个脚本,计算1到100之间所有偶数的和。
脚本思路:
使用 for 循环遍历1到100,用 if 判断偶数并累加。
#!/bin/bashsum=0for i in {1..100}; doif [ $((i % 2)) -eq 0 ]; thensum=$((sum + i))fidoneecho "偶数和: $sum"