掌握Shell脚本的编写和使用是Linux工程师和运维人员的必备技能,也是企业面试的必考点,以下是一些在面试过程中经常会遇到的Shell脚本面试问题及解答

Shell脚本是什么,它是必需的吗?

一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以在一个文本文件(Shell)脚本中添加所有这些命令来完成日常工作任务。

什么是默认登录Shell,如何改变指定用户的登录Shell?

在Linux操作系统中,/bin/bash是默认登录Shell,在创建用户时分配。使用chsh命令可以改变默认的Shell,如下所示:

1
2
$ chsh <用户名> -s <新shell>
$ chsh abelsu7 -s /bin/sh

可以在Shell脚本中使用哪些类型的变量?

在Shell脚本中,我们可以使用两种类型的变量:系统定义变量用户定义变量

系统变量是由系统自己创建的,这些变量通常由大写字母组成,可通过set命令查看。

用户变量是由系统用户生成并定义的,变量的值可以通过命令echo $<变量名>查看。

如何将标准输出和错误输出同时重定向到同一位置?

这里有两个方法可以实现:

1
2
3
4
# 方法一 2>&1
$ ls /usr/share/doc > out.txt 2>&1
# 方法二 &>
$ ls /usr/share/doc &> out.txt

Shell脚本中if语法如何嵌套?

基础语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if [ 条件 ]
then
命令1
命令2
...
else
if [ 条件 ]
then
命令1
命令2
...
else
命令1
命令2
...
fi
fi

Shell脚本中“$?”标记的用途是什么?

在编写Shell脚本时,如果你想要检查上一条命令是否执行成功,在if条件中使用$?可以来检查上一条命令的结束状态。简单的例子如下:

1
2
3
4
$ ls /usr/bin/shuf
/usr/bin/shuf
$ echo $?
0

如果结束状态是0,说明上一条命令执行成功。

1
2
3
4
$ ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory
$ echo $?
2

如果结束状态不是0,说明执行失败。

在Shell脚本中如何比较两个数字?

if-then中使用测试命令如-gt来比较两个数字:

1
2
3
4
5
6
7
8
9
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo "x is greater than y"
else
echo "y is greater than x"
fi

Shell脚本中break命令的作用?

break命令一个简单的用途是退出执行中的循环,我们可以在whileuntil循环中使用break命令跳出循环。

Shell脚本中continue命令的作用?

continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是非常有用的——例如当有错误发生,但我们依然希望执行上层循环时。

Shell脚本中case语句的语法?

基础语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 变量 in
值1)
命令1
命令2
...
最后命令
!!
值2)
命令1
命令2
...
最后命令
;;
esac

Shell脚本中for循环语法?

基础语法如下:

1
2
3
4
5
6
7
for 变量 in 循环列表
do
命令1
命令2
...
最后命令
done

Shell脚本中while循环语法?

如同for循环,while循环只要条件成立就会重复执行命令块。不同于for循环的是,while循环会不断迭代,直到循环条件不为真。

1
2
3
while [ 条件 ] do
命令...
done

例如:

1
2
3
4
5
6
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done

do-while语句的基本格式?

do-while语句类似于while语句,但检查条件语句之前先执行命令(意即至少执行一次):

1
2
3
4
do 
{
命令
} while (条件)

如何使脚本可执行?

使用chmod命令为赋予脚本可执行权限:

1
$ chmod a+x myscript.sh

“#!/bin/bash”的作用?

#!/bin/bash是Shell脚本的第一行,称为释伴(shebang)行。这里#符号叫做hash,而!叫做bang。它的意思是命令通过/bin/bash来执行。

如何调试Shell脚本?

使用-x参数可以调试Shell脚本:

1
$ sh -x myscript.sh

另一种方法是使用-nv参数:

1
$ sh -nv myscript.sh

Shell脚本如何比较字符串?

test命令可以用来比较字符串,测试命令会通过比较字符串中的每一个字符来进行比较。

Bourne Shell(bash)中有哪些特殊的变量?

下表列出了bash中为命令行设置的特殊变量:

内建变量 解释
$0 命令行中脚本名称
$1 第一个命令行参数
$2 第二个命令行参数
$9 第九个命令行参数
$# 命令行参数的数量
$* 所有命令行参数,以空格隔开

在Shell脚本中如何测试文件?

test命令也可以用来测试文件。下表列出了基础用法:

test 用法
-e <文件名> 如果文件存在,返回true
-d <文件名> 如果文件存在并且是目录,返回true
-f <文件名> 如果文件存在并且是普通文件,返回true
-s <文件名> 如果文件存在并且不为空,返回true
-r <文件名> 如果文件存在并可读,返回true
-w <文件名> 如果文件存在并可写,返回true
-x <文件名> 如果文件存在并可执行,返回true

在Shell脚本中如何写入注释?

注释可以用来描述一个脚本可以做什么和它是如何工作的,每一行注释以#开头:

1
2
#!/bin/bash
echo "I am logged in as $USER" # This is a command

如何让Shell脚本得到来自终端的输入?

read命令可以读取来自终端(使用键盘输入)的数据。read命令得到用户的输入并置于给定的变量中:

1
2
3
4
5
6
7
8
9
10
11
$ vi /tmp/test.sh

#!/bin/bash
echo "Please enter your name"
read name
echo "My Name is $name"

$ ./test.sh
Please enter your name
abelsu7
My Name is abelsu7

如何取消变量或取消变量赋值?

unset命令可用于取消变量或取消变量赋值:

1
$ unset <变量名>

如何执行算术运算?

可以使用expr命令:

1
2
$ expr 16 + 4
20

或使用$[ 表达式 ]:

1
2
3
$ test = $[ 16 + 4 ]
$ echo $test
20

如何在Shell脚本中定义函数?

在Shell中可以通过以下两种语法来定义函数,分别如下:

1
2
3
4
5
6
7
function_name ()
{
statement1
statement2
....
statementn
}

或者

1
2
3
4
5
6
7
function function_name()
{
statement1
statement2
....
statementn
}

当函数定义好了以后,用户就可以通过函数名来调用该函数,函数调用的基本语法如下:

1
$ function_name param1 param2 ...

下面定义了一个sayhello()方法,并调用:

1
2
3
4
5
6
#!/bin/bash
function sayhello()
{
echo "Hello,World"
}
sayhello

代码调用结果

1
2
$ sh ./hello.sh
Hello,World

如何在Shell脚本中使用BC(bash计算器)?

在Shell脚本中使用bc的语法如下:

1
var=`echo "options; expression" | bc`

例如下面计算1+2+3+...+10的计算结果

1
2
$ echo $(seq -s "+" 10)=`seq -s "+" 10|bc`
1+2+3+4+5+6+7+8+9+10=55

参考文章

  1. Linux Shell脚本面试25问 | Linux中国
  2. 25 Linux Shell Scripting Interview Questions and Anwsers | LinuxTechi
  3. Linux之Shell算术运算 | cnblogs
  4. Shell test命令 | 菜鸟教程
  5. Linux Shell系列教程之(十一)Shell while循环 | CSDN
  6. LINUX上的SHEBANG符号(#!) | 笑遍世界
  7. Linux Shell编程学习——test测试比较命令 | CSDN
  8. Shell中函数的定义和使用 | CSDN
  9. Shell脚本——数学运算和bc命令 | cnblogs