Shell脚本入门面试知识点(全)
Posted 瓜尔佳敏敏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本入门面试知识点(全)相关的知识,希望对你有一定的参考价值。
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为数字,
n∗∗n为数字,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脚本入门面试知识点(全)的主要内容,如果未能解决你的问题,请参考以下文章