Shell 脚本面试指南

包含 20 多个中级到高级 Linux shell 脚本面试问题的主题,并附有示例和答案:

1、问题:shell 脚本开头的  “#!” 的用途是什么?举个例子。
答案:是shebang 指定脚本的解释器。
示例:#!/bin/bash 表示脚本正在使用 Bash shell。

2、问题:如何向 shell 脚本传递参数?请举例说明。
答:可以:使用 $1, $2 等作为位置参数。

3、问题:解释 shell 脚本中单引号和双引号的区别。
答:单引号保留字面值,而双引号允许变量扩展:
例如:echo 'Hello $USER' 与 echo "Hello $USER"。

4、问题:什么是命令替换,如何在脚本中使用?请举例说明。
答:命令替换:命令替换允许嵌入命令输出。
例如:current_date=$(date)。 

5、问题:如何在 shell 脚本中检查文件是否存在?请写一个有条件的示例。
答:使用 if [ -e "$filename" ]; then ... fi。
 
6、问题:解释 shell 脚本中的 $?
答:$? 表示最后一条命令的退出状态。0 表示成功,非 0 表示错误。

7、问题:shell 脚本中的 here 文档是什么?举例说明。
答:here 文档用于多行输入。举例说明: 

cat <<EOF
this is text
EOF

8、问题:如何在 Bash 中使用 for 循环遍历目录中的文件?请举例说明。
答:举例说明: 

for file in /path/to/dir/*l do
  echo "$file"
done

9、问题:什么是 Bash 中的进程替换?请举例说明。
答:进程替换:进程替换允许将命令的输出视为文件。
例如:diff <(command1) <(command2).

10、问题:如何在一条命令中将 stdout 和 stderr 重定向到一个文件?
答:使用命令 &> output.log。 

11、问题:解释 shell 脚本中 set -e 选项的作用。
答:set -e 使脚本在任何命令返回非零状态时退出

12、问题:什么是 shell 脚本中的管道?请举例说明。
答:管道管道将一个命令的 stdout 连接到另一个命令的 stdin。
例如:cat file.txt | grep "pattern"。 

13、 问题:如何在 shell 脚本中创建和使用函数?请说明函数的定义和用法。
回答:示例: 

my_function(){
   echo "Hello, %1!"
}
my_function "Alice"

14、问题:什么是 shell 脚本中的进程分叉?请举例说明。
答:进程分叉就是创建新进程:进程分叉就是创建新进程。
例如:forked_process &. 

15、问题:解释 shell 脚本条件语句中 == 和 = 的区别。
答: == 用于字符串比较,而 = 用于变量赋值。 
 
16、问题:如何在 shell 脚本中捕获信号?请举例说明。
回答:示例:trap SIGINT (Ctrl+C): 
trap 'echo "Ctrl+C pressed"' INT

17、问题:Bash 中的关联数组是什么,如何使用?举例说明。
答:关联数组关联数组允许键值对。举例说明: 

declare -A fruits
fruits["apple"]="red"
echo "Color of apple: ${fruits["apple"]}"

18、问题:如何检查 shell 脚本中的变量是否为空?
答:使用 if [ -z "$var" ]; then ... fi。 

19、问题:shell 脚本中的 read 命令有什么作用?请举例说明。
答:read 用于读取用户输入。 

20、问题:解释条件语句中 && 和 || 的区别。
答:如果左命令成功,&& 执行右命令。|| 表示如果左侧命令失败,则执行右侧命令。