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/bash

echo "和: $(($1 + $2))"

echo "差: $(($1 - $2))"

echo "积: $(($1 * $2))"

echo "商: $(($1 / $2))"

2.编写一个脚本,判断用户输入的文件是否存在,若存在则输出文件类型(普通文件、目录等),若不存在则提示“文件不存在”。


脚本思路:

使用 -f 判断普通文件,-d 判断目录。

#!/bin/bash

if [ -f "$1" ]; then

  echo "普通文件"

elif [ -d "$1" ]; then

  echo "目录"

else

  echo "文件不存在"

fi

3.编写一个脚本,批量创建10个用户(user1到user10),并设置初始密码为123456,创建完成后提示“用户创建完成”。


脚本思路:

使用 for 循环创建用户,useradd 添加用户,echo "123456" | passwd --stdin 设置密码。

#!/bin/bash

for i in {1..10}; do

  useradd user$i

  echo "123456" | passwd --stdin user$i

done

echo "用户创建完成"

4.编写一个脚本,统计指定目录下普通文件的数量,并输出文件名包含“log”的文件列表。


脚本思路:

使用 find 查找普通文件并计数,再用 grep 过滤含 “log” 的文件。

#!/bin/bash

count=$(find $1 -type f | wc -l)

echo "普通文件数量: $count"

echo "含 log 的文件:"

find $1 -type f -name "*log*"

5.编写一个脚本,计算1到100之间所有偶数的和。

脚本思路:

使用 for 循环遍历1到100,用 if 判断偶数并累加。

#!/bin/bash

sum=0

for i in {1..100}; do

  if [ $((i % 2)) -eq 0 ]; then

    sum=$((sum + i))

  fi

done

echo "偶数和: $sum"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值