700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux | Shell 学习笔记(二)Shell 流程控制 if case for while| read读取

Linux | Shell 学习笔记(二)Shell 流程控制 if case for while| read读取

时间:2023-03-12 18:37:51

相关推荐

Linux | Shell 学习笔记(二)Shell 流程控制 if case for while| read读取

文章目录

参考资料运行环境一、流程控制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 循环

基本语法1

for (( 初始值;循环控制条件;变量变化 ))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会将pathnamestring中的 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)NRawk命令的内置变量,表示已读的记录数,即当前的行号

(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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。