文章目录
参考资料运行环境一、流程控制1.1 if 判断1.2 case 语句1.3 for 循环1.4 while 循环二、 read 读取控制台输入三、函数3.1 系统函数basename 函数dirname 函数3.2 自定义函数四、*Shell 工具4.1 cut4.2 sed4.3 awk4.4 sort五、Shell命令企业面试真题5.1 京东5.2 搜狐 & 和讯网5.3 新浪5.4 金河网络参考资料
视频链接
运行环境
windows10Linux CentOS 7Xshell 7一、流程控制
1.1 if 判断
基本语法#写法一if [ 条件判断式 ]; then程序fi#写法二if [ 条件判断式]then程序fi
注意事项:(1) [ 条件判断式 ] ,中括号和条件判断式之间必须有空格 (2) if 后要有空格
案例
输入数字,判断是否大于0,大于0则输出true,小于或等于0则输出false
#!/bin/bashif [ $1 -gt 0 ]thenecho true elif [ $1 -le 0 ] then echo falsefi
1.2 case 语句
基本语法case $变量名 in "值1")如果变量的值等于值1,则执行程序1...;;"值2")如果变量的值等于值2,则执行程序2...;;...省略其他分支*)如果变量的值都不是以上的值,则执行此程序;;esac
注意事项:
case 行尾必须为单词 “in” ,每一个模式匹配必须以右括号 “)” 结束。双分号 “;;” 表示命令序列结束,相当于 java 中的break。最后的 “*)” 表示默认模式,相当于java中的default。 案例
输入用户名和密码,如果不对则提示错误的信息
#!/bin/bashif [ $# -eq 2 ]then# 判断用户名是否正确 case $1 in "uni")echo '用户名正确!' ;;*)echo '用户名错误.';;esac# 判断密码是否正确 case $2 in "123")echo '密码正确!';;*)echo '密码错误!';;esacelif [ $# -ne 2 ];thenecho '输入参数有误,请输入用户名和密码'fi
1.3 for 循环
基本语法1for (( 初始值;循环控制条件;变量变化 ))do程序done
案例 计算 1+2+3…+100的值
#!/bin/bashsum=0 for(( i=1;i<=100;i++))dosum=$[$sum+$i]done echo $sum
运行结果:5050
基本语法2
for 变量 in 值1 值2 值3...do 程序done
案例
对输入的参数求和
#!/bin/bashsum=0for x in $*dosum=$[$sum+$x]doneecho $sum
注意:遍历"$*"
时候只会遍历一次,而遍历"$@"
则会遍历每一个输入参数
1.4 while 循环
基本语法while [ 条件表达式 ]do 程序done
案例
计算1+2+3…+100的结果
#!/bin/bashsum=0 i=1while [ $i -le 100 ]dosum=$[$sum + $i]i=$[$i + 1] done echo $sum
二、 read 读取控制台输入
基本语法read(选项)(参数)
选项 -p :指定读取值时候的提示符-t :指定读取值时等待的时间(秒) 参数 变量:指定读取值的变量名 案例
提示5秒内,读取控制台的输入用户名
#!/bin/bashread -t 5 -p "请在5秒内输入用户名: " NAMEecho $NAME
三、函数
3.1 系统函数
basename 函数
基本语法:basename [string / pathname] [suffix]
功能描述:删掉所有的后缀包括最后一个 (’/’)字符,然后打印字符串
选项说明:suffix
为后缀,若被指定,basename
会将pathname
或string
中的 suffix 去掉
案例:截取当前脚本去掉后缀后的的名称
basename ./uni.sh .sh
dirname 函数
基本语法:dirname [string / pathname] [suffix]
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
案例:获取uni.sh
的文件路径
dirname /home/s0125/uni.sh
3.2 自定义函数
基本语法:
[ function ] funname[()]{函数内容;[return int;]}funname
使用技巧:
在调用函数之前需要先声明函数,shell脚本是逐行运行的,不会像其他语言先编译函数返回值,只能通过$?
系统变量获得,可以显示加 :return 返回,如果不加,将以最后一条命令运行结果,作为返回值,return后跟数组n(0-255)
案例:使用函数计算两个输入参数的和
#!/bin/bashfunction sum(){s=0;s=$[$1+$2]echo $s}read -p "输入数字a: " aread -p "输入数字b: " bsum $a $b
四、*Shell 工具
4.1 cut
基本语法:cut [选项参数] filename
功能描述:在文件中负责剪切数据,该命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
参数说明:
案例:以空格剪切测试的文本
测试的文本内容:
test.txt
hello worldthis is a testi love you
切割第一列 切割第二、三列 获取 love 字段
cat test.txt | grep lovecat test.txt | grep love | cut -d " " -f 2
获取 系统PATH变量的第二个 “:” 开始后的所有路径
echo $PATH | cut -d ":" -f 3-
其中,-f
参数后的3-
表示为从第3列开始到最后一列,而-3
则可以表示为前三列
切割ifconfig
命令 后打印的 IP地址
ifconfig ens33 | grep "inet 1" | cut -d " " -f 10
4.2 sed
基本语法:sed [选项参数] 'command' filename
功能描述:sed是一种流编辑器,每次处理一行内容。处理时,把当前处理的行存储在临时缓存区中,称为”模式空间“,接着用 sed 命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
选项参数:
command命令参数:
案例:
测试文本 sed.txt
hello worlduni likes sleepdo you like runi like eat rice
在 sed.txt 中的第二行下方插入一行内容
sed "2a and run" sed.txt
删除 sed.txt 文件中 包含 like的行
sed '/like/d' sed.txt
将 sed.txt 文件中 like 替换成 love
sed 's/like/love/g' sed.txt
注:命令中的 g 为 global的缩写,表示全局替换
将 sed.txt 文件中的第二行删除并将 like 替换成 love
sed -e '2d' -e 's/like/love/g' sed.txt
4.3 awk
基本语法:awk [选项参数] 'pattern1 {action1} pattern2 {action2} ...' filename
功能描述:一个强大的文本分析工具,把文件逐行的读入,以空格为默认的分隔符将每行切片,切开的部分再进行分析处理
参数说明:
pattern
:表示 AWK 在数据中查找的内容,即匹配模式action
: 在找到匹配内容时所执行的一系列命令
选项参数(部分):
案例:
准备数据
sudo cp /etc/passwd ./# 赋予读的权限sudo chown 用户名:用户名 passwdcat passwd
搜索passwd
文件以root
关键字开头的所有行,并输出改行的第七列
awk -F ':' '/^root/ {print $7}' passwd
运行结果:
/bin/bash
搜索passwd
文件以root
关键字开头的所有航,并输出该行的第1列和第7列,中间以", "分割
awk -F : '/^root/ {print $1","$7}' passwd
运行结果:
root,/bin/bash
注意:只有匹配了pattern
的行才会执行action
只显示passwd
文件的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell在最后一行添加"uni, /bin/test"
awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "uni, bin/test"}' passwd
注意:BEGIN
在所有数据读取行之前执行;END
在所有数据执行之后执行
将passwd
文件中的用户 id 增加数值1并输出
awk -F : -v i=1 '{print $3+i}' passwd
内置变量:
案例:
统计passwd
文件名,每行的括号,每行的列数
awk -F : '{print "filename:" FILENAME ", LineNumber: " NR ",columns: " NF}' passwd
运行结果:
filename:passwd, LineNumber: 1,columns: 7filename:passwd, LineNumber: 2,columns: 7filename:passwd, LineNumber: 3,columns: 7filename:passwd, LineNumber: 4,columns: 7...
切割 IP
ifconfig ens33 | grep "inet 1" | awk -F ' ' '{print $2}'
查询sed.txt
中空行所在的行号
awk '/^$/{print NR}' sed.txt
其中^$
表示开头结尾之间没有任何内容,即可用来表示空行
4.4 sort
基本语法:sort (选项) (参数)
功能描述:sort 命令在Linux里非常又用,将文件进行排序,并将排序结果标准输出
参数说明:(部分)
参数:指定待排序的文件列表
案例:
准备测试数据 sort.txt
a:40:5.4b:20:4.2c:50:2.3d:10:3.5e:30:1.6
依照第二列数据递减排序
sort -t : -nrk 2 sort.txt
五、Shell命令企业面试真题
5.1 京东
问题1:使用Linux 命令查询 file1中空行所在的行号
回答1:
awk '/^$/{print NR}' sed.txt
本题考点:
(1)awk
命令的基本语法awk 'pattern1{action1} ... '
当pattern1
匹配成功时才执行action1
(2)NR
是awk
命令的内置变量,表示已读的记录数,即当前的行号
(3) 空行的正则表达式方法,^
表示以某个符号开头,$
表示以某个符号结尾,它们之间为空表示一个空行
问题2:给出下面的文件socre.txt
,计算第二和列的和并输出
张三 40李四 50王五 60
回答2:
cat score.txt | awk -F " " '{sum+=$2} END{print sum}'
5.2 搜狐 & 和讯网
问题:Shell 脚本里如何检查一个文件是否存在?如果不存在该如何处理?
回答:
#!/bin/bashif [ -f file.txt]; thenecho "文件存在."elseecho "文件不存在!"fi
5.3 新浪
问题:用 Shell 写一个脚本,对文本无序的一列数字排序
回答:可以使用awk命令求和
sort -n test.txt | awk '{a+=$0;print$0} END{print "sum="a}'
5.4 金河网络
问题:请用 Shell 脚本写出查找当前文件夹(/home)下所有的文件内容中包含有字符 "shen"的文件名称
回答:
grep -r "shen" /home | cut -d ":" -f 1
Linux | Shell 学习笔记(二)Shell 流程控制 if case for while| read读取输入 | 函数的使用 | cut sed awk sort命令 +Demo