Shell脚本入门面试知识点(全)

Posted 瓜尔佳敏敏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本入门面试知识点(全)相关的知识,希望对你有一定的参考价值。

课程链接:https://www.bilibili.com/video/BV1hW41167NW/?p=2&spm_id_from=pageDriver&vd_source=ea9ec7c370ef728a582ede44cc461e25

Shell概述

Shell是一个命令行解释器,接收用户命令,调用系统内核

解析器类型

  • sh
  • bash
  • nologin
  • dash
  • tcsh
  • csh

其中,sh软链接到bash, centos默认解析器是bash

Shell脚本入门

脚本格式

脚本开头指定解析器

#!/bin/bash

一个输出hello,word的脚本 1.sh

#!/bin/bash
echo hello,word

执行脚本

bash 1.sh ---方法1
sh 1.sh  ----方法2
source 1.sh ----方法3

./1.sh  ----方法4,需要给权限,chmod 777 1.sh

多命令行例子

需求在指定目录/home/atguigu/下创建一个banzhang.txt,在banzhang.txt中增加’I Love LSX’ 。

#!/bin/bash
cd /home/atguigu/
touch banzhang.txt
echo "I Love LSX" >> banzhang.txt

Shell中的变量

常用系统变量

$HOME 当前用户的Java目录
$PWD 当前路径
$SHELL 默认的解析器
$USER 当前用户

自定义变量

语法:

  • 定义变量:变量=值
  • 撤销变量: unset 变量
  • 声明静态变量: readonly 变量,不能unset
A=1
echo $A
//输出1

自定义变量规则:

  • 可以由字母、数字和下划线组成,不能以数字开头,环境变量名建议大写
  • 等号两侧不能有空格
  • 在bash中,变量默认类型是字符串类型,无法直接进行数值运算
  • 变量的值如果有空格,需要用双引号或者单引号
  • 可把变量提升为全局环境变量,使用export 变量名

特殊变量

**(1) n ∗ ∗ n 为数字, n** n为数字, nn为数字,n表示该脚本名称,$1-$9表示第一到第九个参数,10以上的参数要用大括号括起来
此处参数表示执行脚本时的参数

touch parameter.sh
vim parameter.sh

#!/bin/bash
echo "$0 $1 $2 $3"


(2)$#
获取所有输入参数个数

#!bin/bash
echo "$0 $1 $2"
echo $#


(3)∗,@
$*: 代表命令行中所有的参数,把所有参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待

#!bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@


(4)$?
最后一次执行的命令的返回状态,如果该变量的值为0,说明上一次正确执行了,如果返回非0的数字说明没有正确执行。

运算符

( ( 运算式 ) ) " 或者 " ((运算式))" 或者 " ((运算式))"或者"[运算式]”
expr +,-,*,/, %
expr运算符间要有空格

expr 2 + 3
expr `expr 2 + 3` \\* 4

` 为esc下边的字符,不是英文引号。

s=$[(2+3)*4]
echo $s

条件判断

语法

[ condition ] condition前后要有空格,条件非空即为true

常用判断条件

(1)整数比较

= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于


(2)文件权限判断

-r 读
-w 写
-x 执行


(3)文件类型判断

-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录


(4)多条件判断

$$ 与,前对才执行后
|| 或

流程控制(重点)

if语句

语法:

if [ condition ];then
	程序
fi
-------或者--------------------
if [ condition ]
	then
		程序
fi

注意:
[ condition ] 中括号和条件判断式之间必须有空格
if后面要有空格

案例:
输入一个数字,如果是1,则输出hello,如果是2,则输出word,如果是其他,什么也不输出

#!/bin/bash
if [ $1 -eq 1 ]
then
	echo "hello"
elif [ $1 -eq 2 ]
then
	echo "word"
fi

执行脚本

bash if.sh 1

输出:hello

case语句

语法:

case $变量名 in  
	"值 1") 
		程序;; 
	"值 2") 
		程序;; 
	*)
  	程序;;
esac

注意:
case行尾必须为单词in ,每一个模式匹配必须以右括号结尾
双分号;;表示命令序列结束,相当于java中的break
最后的*)表示默认模式,相当于java中的default

案例:

#!/bin/bash
case $1 in  
"1") 
	echo "男士";; 
"2") 
	echo "女士";; 
*)
	echo "人妖";; 
esac

for循环

语法

for (( 初始值;循环控制条件;变量变化 ))
	do
  	程序
	done

或者

for 变量 in 值1 值2 值3 ... 
	do
		程序
	done

案例:

#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
  	s=$[$s+$i]
done
echo $s
#!/bin/bash

for i in $*
do
  	echo "banzhang xihuan $i"
done

#!/bin/bash

for i in "$*"
do
  	echo "banzhang love $i"
done

for j in "$@"
do
  	echo "banzhang love $j"
done

while 循环

语法

while [ condition ]
do 
	程序
done

案例

#!/bin/bash

s=0
i=0
while [ $i -le 100 ]
do
	s=$[$s+$i]
	i=$[$i+1]
done

echo $s

read读取控制台输入

语法

read(选项)(参数)
选项:
  -p: 指定读取值时的提示内容
  -t:指定读取值时等待的事件(秒)
参数
  变量:指定读取值的变量名

案例

!#/bin/bash

read -t 7 -p "input your name" NAME
echo $NAME

函数

系统函数

basename
basename [string/ pathname][suffix] 

功能描述:命令会删除所有的后缀包括最后一个/字符的然后输出字符串;
选项:如果指定suffix 为后缀,basename会将string或者pathname中的后缀去掉;

用来获取文件名

dirname

dirname 文件绝对路径, 从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径

自定义函数

[ function ] funname[()]

	Action;
	[return int;]

funname

必须在调用函数地方之前,要先声明函数;
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将最后一条命令运行结果做为返回值,return后跟数值n(0-255)

#!/bin/bash

function sum()

	s=0
	s=$[$1+$2]
	echo $s


read -p "input your paramter1:" P1
read -p "input your paramter2:" P2

sum $P1 $P2

Shell工具

cut

在文件中剪切数据用,从文件中的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
基本用法

cut[选项参数] filename

默认分隔符是制表符
选项参数
-f 列号: 提取第几列
-d 分隔符,按照指定分隔符分割
举例
数据准备

cut -d " " -f 1 cut.txt

cut -d " " -f 2,3 cut.txt

1、先过滤出guan开头的文字行
2、再切割

3-表示第三列以及第三列后的所有数据

eth0 内的 inet addr后的ip地址

sed

一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,sed命令处理缓冲区中的内容,处理完成后,把内容送往屏幕,接着处理下一行,不断重复。文件内容不改变,除非你使用重定向存储输出。
基本用法

sed [选项参数] `command` filename

选项参数
-e 直接在指令列模式上进行sed的动作编辑
命令功能
a 新增
d 删除
s查找并替换
案例
1、数据准备

(1)将"mei nv"插入sed.txt第二行下

2a表示第二行下面新增,源文件并没有改变。
(2)删除sed文件中包含“wo”的行

(3)将文件中“wo”替换为“ni”

g 表示全局替换
(4)将文件的第二行删除,并将“wo”替换为“ni”

awk

强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法

awk [选项参数] 'pattern1action1' filename

pattern:表示awk在数据中查找的内容
action:找到匹配内容时执行命令
选项参数
-F:指定输入文件分隔符
-v:赋值一个用户定义变量
案例
1、数据准备

sudo cp /etc/passwd ./

2、修改文件权限

3、查看文件内容

(1)搜索文件以“root”开头的所有行,并输出该行的第7列

(2)搜索文件以“root”开头的所有行,并输出该行的第1列和第7列,以“,”分隔

(3)只显示/etc/passwd的第一列和第七列,以逗号分隔,且在所有行前面添加列名user,shell在最后一行添加“dahaige,/bin/zuishuai”。

BEGIN在所有数据读取行之前执行,END在所有数据执行后执行。
(4)将passwd中的用户id增加数值1并输出

内置变量

filename:文件名
nr:已读的记录数
nf:浏览记录的域的个数
(1)统计passwd文件名,每行的行号,每行的列数

(2)切割ip

(3)查询sed.txt中空行所在的行号

sort

文件排序
基本用法

sort(选项)(参数)

选项
-n 按照数值大小排序
-r 以相反的顺序排序
-t 设置排序使用的分隔字符
-k 指定需要排序的列
参数
指定待排序文件列表
案例
1、数据准备

(1)按照第二列倒序排序

企业真实面试题




以上是关于Shell脚本入门面试知识点(全)的主要内容,如果未能解决你的问题,请参考以下文章

面试linux运维一定会问到Shell脚本这24个问题

面试Linux运维一定会问到Shell脚本这24个问题

面试linux运维一定会问到Shell脚本这24个问题

合格linux运维人员必会的30道shell编程面试题及讲解

那个面试官好像一条狗运维面试题之linux编程

Linux入门——基础shell