我们为您的面试准备选择了预期的 70 个 shell 脚本问题和答案。对于所有系统管理员来说,了解脚本或至少基础知识真的很重要,这反过来有助于在您的工作环境中自动执行许多任务。在过去的几年里,我们已经看到所有的 linux 工作规范都需要脚本技能。
1)如何将参数传递给脚本?
./脚本参数
示例:脚本将显示文件名
./show.sh file1.txt
cat show.sh
#!/bin/bash
cat $1
2)如何在脚本中使用参数?
第一个参数:$1,
第二个参数:$2
示例:脚本将文件 (arg1) 复制到目标 (arg2)
./copy.sh file1.txt /tmp/
cat copy.sh
#!/bin/bash
cp $1 $2
3)如何计算传递参数的数量?
$#
4)如何在脚本中获取脚本名称?
$0
5)如何检查之前的命令是否运行成功?
$?
6)如何从文件中获取最后一行?
tail -1
7)如何从文件中获取第一行?
head -1
8)如何从文件的每一行中获取第三个元素?
awk '{print $3}'
9)如果第一个等于 FIND,如何从文件的每一行中获取第二个元素
awk '{ if ($1 == "FIND") print $2}'
10) 如何调试 bash 脚本
将 -xv 添加到 #!/bin/bash
例子
#!/bin/bash –xv
11)举个例子如何编写函数?
function example {
echo "Hello world!"
}
12)如何将字符串添加到字符串?
V1="Hello"
V2="World"
let V3=$V1+$V2
echo $V3
输出
Hello+World
13)如何将两个整数相加?
V1=1
V2=2
V3=$V1+$V2
echo $V3
输出
3
Remember you need to add "let" to line V3=$V1+$V2
then echo $V3 will give 3
if without let , then it will be
echo $V3 will give 1+2
14)如何检查文件系统上是否存在文件?
if [ -f /var/log/messages ]
then
echo "File exists"
fi
15)写下 shell 脚本中所有循环的语法?
循环:
for i in $( ls ); do
echo item: $i
done
while 循环:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
直到循环:
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
16)每个脚本开头的#!/bin/sh 或#!/bin/bash 是什么意思?
该行告诉使用哪个 shell。#!/bin/bash 使用 /bin/bash 执行的脚本。如果是 python 脚本,会有 #!/usr/bin/python
17)如何从文本文件中获取第 10 行?
head -10 file|tail -1
18) bash 脚本文件中的第一个符号是什么
#
19)命令的输出是什么: [ -z "" ] && echo 0 || 回声 1
0
20)什么命令“export”?
在子shell中公开变量
21)如何在后台运行脚本?
在脚本末尾添加“&”
22) “chmod 500 脚本”是做什么的?
使脚本所有者可以执行脚本
23) “>”做什么?
将输出流重定向到文件或另一个流。
24) & 和 && 有什么区别
& - 当我们想要将脚本放到后台时使用它
&& - 当我们想要执行命令/脚本时,如果第一个脚本成功完成
25)当我们在 [条件] 之前需要 "if" 时?
如果条件满足,我们需要运行多个命令。
26)命令的输出是什么:name=John && echo 'My name is $name'
My name is $name
27) bash shell 脚本中用于注释的符号是什么?
#
28)命令的输出是什么: echo ${new:-variable}
variable
29) ' 和 " 引号之间有什么区别?
' - 我们在不想将变量评估为值时使用它
" - 将评估所有变量并分配其值。
30)如何将 stdout 和 stderr 流从脚本内部重定向到 log.txt 文件?
添加“exec >log.txt 2>&1”作为脚本中的第一个命令
31)如何仅使用 echo 命令获取部分字符串变量?
echo ${variable:x:y}
x - 起始位置
y - 长度
示例:
variable="我的名字是 Petras,我是开发人员。"
echo ${variable:11:6} # 将显示 Petras
32)仅当字符串变量=“User:123:321:/home/dir”给出时,如何使用echo 命令获取home_dir?
echo ${variable#*:*:*:}
或
echo ${variable##*:}
33)如何从上面的字符串中获取“用户”?
echo ${variable%:*:*:*}
或
echo ${variable%%:*}
34)如何列出 UID 小于 100 (awk) 的用户?
awk -F: '$3<100' /etc/passwd
35)编写程序,为用户计算唯一的主要组并仅显示计数和组名
cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
do
{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
done
36)如何在 bash shell 中将标准字段分隔符更改为“:”?
IFS=“:”
37)如何获得可变长度?
${#variable}
38)如何打印变量的最后 5 个字符?
echo ${variable: -5}
39) ${variable:-10} 和 ${variable:-10} 有什么区别?
${variable:-10} - 如果在 ${variable: -10} 之前没有分配变量,则给出 10 - 给出
变量的最后 10 个符号
40)如何仅用 echo 命令替换部分字符串?
echo ${变量//模式/替换}
41)哪个命令将字符串替换为大写?
tr '[:lower:]' '[:upper:]'
42)如何计算本地账户?
wc -l /etc/passwd|cut -d" " -f1
或
cat /etc/passwd|wc -l
43)如何在没有 wc 命令的情况下计算字符串中的单词?
set ${string}
echo $#
44)哪个是正确的“export $variable”或“export variable”?
export variable
45)如何列出第二个字母为 a 或 b 的文件?
ls -d ?[ab]*
46)如何将整数 a 添加到 b 并分配给 c ?
c=$((a+b))
或
c=`expr $a + $b`
或
c=`echo "$a+$b"|bc`
47)如何从字符串中删除所有空格?
echo $string|tr -d " "
48)重写命令打印句子并将变量转换为复数:item="car";回声“我喜欢$item”?
item="car"; echo "I like ${item}s"
49)编写将打印从 0 到 100 的数字并每隔三分之一显示一次 (0 3 6 9 ...) 的命令?
for i in {0..100..3}; do echo $i; done
or
for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
50)如何打印提供给脚本的所有参数?
echo $*
or
echo $@
51) [ $a == $b ] 和 [ $a -eq $b ] 有什么区别
[ $a == $b ] - 应该用于字符串比较
[ $a -eq $b ] - 应该用于数字测试
52) = 和 == 之间有什么区别
= - 我们用来给变量赋值
== - 我们用来比较字符串
53)编写命令来测试 $a 是否大于 12 ?
[$a-gt 12]
54)编写命令来测试 $b 是否等于 12 ?
[ $b -le 12 ]
55)如何检查字符串是否以“abc”字母开头?
[[ $string == abc* ]]
56) [[ $string == abc* ]] 和 [[ $string == "abc*" ]] 有什么区别
[[ $string == abc* ]] - 将检查字符串是否以 abc 字母开头
[[ $string == "abc*" ]] - 将检查字符串是否完全等于 abc*
57)如何列出以 ab 或 xy 开头的用户名?
egrep "^ab|^xy" /etc/passwd|cut -d: -f1
58)什么$!意味着在 bash 中?
最近的后台命令 PID
59)什么$??
最近的前台退出状态。
60)如何打印当前shell的PID?
echo $$
61)如何获取传递给脚本的参数数量?
echo $#
62) $* 和 $@ 有什么区别
$* - 将所有传递给脚本的参数作为单个字符串
提供 $@ - 将所有传递给脚本的参数作为分隔列表提供.分隔符 $IFS
63)如何在 bash 中定义数组?
array=("Hi" "my" "name" "is")
64)如何打印第一个数组元素?
echo ${array[0]}
65)如何打印所有数组元素?
echo ${array[@]}
66)如何打印所有数组索引?
echo ${!array[@]}
67)如何删除 id 为 2 的数组元素?
unset array[2]
68)如何添加 id 为 333 的新数组元素?
array[333]="New_element"
69) shell 脚本如何获取输入值?
a) 通过参数
./script param1 param2
b) 通过读命令
read -p "Destination backup Server : " desthost
70)我们如何在脚本中使用“expect”命令?
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD