掌握Shell脚本的编写和使用是Linux工程师和运维人员的必备技能,也是企业面试的必考点,以下是一些在面试过程中经常会遇到的Shell脚本面试问题及解答。
Shell脚本是什么,它是必需的吗?
一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以在一个文本文件(Shell)脚本中添加所有这些命令来完成日常工作任务。
什么是默认登录Shell,如何改变指定用户的登录Shell?
在Linux操作系统中,/bin/bash
是默认登录Shell,在创建用户时分配。使用chsh
命令可以改变默认的Shell,如下所示:
chsh <用户名> -s <新shell>
chsh abelsu7 -s /bin/sh
可以在Shell脚本中使用哪些类型的变量?
在Shell脚本中,我们可以使用两种类型的变量:系统定义变量和用户定义变量。
系统变量是由系统自己创建的,这些变量通常由大写字母组成,可通过set
命令查看。
用户变量是由系统用户生成并定义的,变量的值可以通过命令echo $<变量名>
查看。
如何将标准输出和错误输出同时重定向到同一位置?
这里有两个方法可以实现:
# 方法一 2>&1
ls /usr/share/doc > out.txt 2>&1
# 方法二 &>
ls /usr/share/doc &> out.txt
Shell脚本中if语法如何嵌套?
基础语法如下:
if [ 条件 ]
then
命令1
命令2
...
else
if [ 条件 ]
then
命令1
命令2
...
else
命令1
命令2
...
fi
fi
Shell脚本中“$?”标记的用途是什么?
在编写Shell脚本时,如果你想要检查上一条命令是否执行成功,在if
条件中使用$?
可以来检查上一条命令的结束状态。简单的例子如下:
ls /usr/bin/shuf
/usr/bin/shuf
echo $?
0
如果结束状态是0
,说明上一条命令执行成功。
ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory
echo $?
2
如果结束状态不是0
,说明执行失败。
在Shell脚本中如何比较两个数字?
在if-then
中使用测试命令如-gt
来比较两个数字:
#!/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
命令一个简单的用途是退出执行中的循环,我们可以在while
和until
循环中使用break
命令跳出循环。
Shell脚本中continue命令的作用?
continue
命令不同于break
命令,它只跳出当前循环的迭代,而不是整个循环。continue
命令很多时候是非常有用的——例如当有错误发生,但我们依然希望执行上层循环时。
Shell脚本中case语句的语法?
基础语法如下:
case 变量 in
值1)
命令1
命令2
...
最后命令
!!
值2)
命令1
命令2
...
最后命令
;;
esac
Shell脚本中for循环语法?
基础语法如下:
for 变量 in 循环列表
do
命令1
命令2
...
最后命令
done
Shell脚本中while循环语法?
如同for
循环,while
循环只要条件成立就会重复执行命令块。不同于for
循环的是,while
循环会不断迭代,直到循环条件不为真。
while [ 条件 ] do
命令...
done
例如:
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
do-while语句的基本格式?
do-while
语句类似于while
语句,但检查条件语句之前先执行命令(意即至少执行一次):
do
{
命令
} while (条件)
如何使脚本可执行?
使用chmod
命令为赋予脚本可执行权限:
chmod a+x myscript.sh
“#!/bin/bash”的作用?
#!/bin/bash
是Shell脚本的第一行,称为释伴(shebang)行。这里#
符号叫做hash,而!
叫做bang。它的意思是命令通过/bin/bash
来执行。
如何调试Shell脚本?
使用-x
参数可以调试Shell脚本:
sh -x myscript.sh
另一种方法是使用-nv
参数:
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脚本中如何写入注释?
注释可以用来描述一个脚本可以做什么和它是如何工作的,每一行注释以#
开头:
#!/bin/bash
echo "I am logged in as $USER" # This is a command
如何让Shell脚本得到来自终端的输入?
read
命令可以读取来自终端(使用键盘输入)的数据。read
命令得到用户的输入并置于给定的变量中:
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
命令可用于取消变量或取消变量赋值:
unset <变量名>
如何执行算术运算?
可以使用expr
命令:
expr 16 + 4
20
或使用$[ 表达式 ]
:
test = $[ 16 + 4 ]
echo $test
20
如何在Shell脚本中定义函数?
在Shell中可以通过以下两种语法来定义函数,分别如下:
function_name ()
{
statement1
statement2
....
statementn
}
或者
function function_name()
{
statement1
statement2
....
statementn
}
当函数定义好了以后,用户就可以通过函数名来调用该函数,函数调用的基本语法如下:
function_name param1 param2 ...
下面定义了一个sayhello()
方法,并调用:
#!/bin/bash
function sayhello()
{
echo "Hello,World"
}
sayhello
代码调用结果
sh ./hello.sh
Hello,World
如何在 Shell 脚本中使用 BC(bash计算器)?
在Shell脚本中使用bc
的语法如下:
var = `echo "options; expression" | bc`
例如下面计算1+2+3+...+10
的计算结果
echo $(seq -s "+" 10)=`seq -s "+" 10 | bc`
1+2+3+4+5+6+7+8+9+10=55
参考文章