大家好,我是阿Q。
时隔几个月我又开始了公众号的更新,消失的这段时间(可能是玩了几个月吧),之前一直在想我这个号接下来更新一些什么内容好呢?八股?唠嗑?简历指导?
其实我觉得对我来说发什么都一样,最理想的效果就是让大家在读文章的时候,感觉是在跟我聊天一样。就好像是咱俩在做技术交流、在唠嗑,并愉快的学习了不少知识。毕竟也是学计算机出身,也经历过校招、社招,也有做过简历(现在的环境,机会少之又少,好的简历是你进公司的敲门砖,所以一定要认真对待)。
总的来说,只要是对大家有用,我都会做。。。
现在发布的大多数内容都是从整体来做一些笼统的总结,主要就是面向校招,或者是刚毕业一两年的社招。这其中还是以校招难度的八股为主,毕竟当前大多企业都是看学习能力和解决问题能力,基础掌握牢固的话也算是很有优势的吧(希望你们如此,今年行情真不咋好.....)
后面的话可能会将某些知识点细化,制作简历模板(实习、校招、社招),面经分享(校招、1-3年社招),或者跟大家唠唠嗑哈哈哈...
ok,前面说这么多就是对自己这个公众号后边做的一些规划吧,也感谢大家这么长时间的支持。
今天的话就是再把之前学Shell遗留下来的一些知识点分享给大家,之前一期Shell脚本基础(大全),说它全也挺全的,说不全也是差点意思,主要还是面向谁,这节就是一点补充呢。
正文来喽~
Shell?
Linux操作系统核心和外部应用程序的一个接口。是一个命令行解释器,接收应用程序/用户命令,然后调用操作系统内核。
1、脚本格式
脚本以#! bin/bash开头(指定解析器)
2、第一个Shell脚本
需求:创建一个Shell脚本,输出helloworld
案例实操:
脚本的常用执行方式
第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
第三种(了解)
前两种方式都是在当前Shell中打开一个子Shell来执行脚本内容,当脚本内容结束,则子Shell关闭,会到父Shell中。
第三种,可以使脚本内容在当前Shell里执行,而无需打开子Shell,这也就是为什么我们每次修改完/etc/profile文件以后,需要source一下的原因。

#!bin/bashecho "helloworld"
sh+脚本的相对路径

sh+脚本的绝对路径

bash+相对路径

bash+绝对路径

首先要赋予hell0world.sh脚本的+x权限

执行脚本
相对路径

绝对路径

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
在脚本的路径前加上“.”或者source
原因:
3、变量
3.1、系统定义变量
常用系统变量
$HOME、$PWD、$USER
案例实操
查看系统变量的值

显示当前Shell中所有变量

3.2、自定义变量
基本语法
定义变量:变量名=变量值,注意,=号前后不能有空格
撤销变量:unset变量名
声明静态变量:readonly变量,注意:不能unset
变量定义规则
变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格。
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或单引号括起来。
实操...
3.3、特殊变量
$n
n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,10以上的参数,需要用大括号包含,如${10}。
$#
功能描述:获取 所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性。
$*、$@
基本用法
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。
$@:这个变量代表命令行中所有的参数,不过$@把每个参数区分对待。
案例...
以上案例实操:
#!/bin/bashecho '======$n======'echo script name:$0echo 1st paramater:$1echo 2nd parameter:$2echo '======$#======'echo parameter numbers:$#echo '======$*======'echo $*echo '======$@======'echo $@
结果:

$?
基本用法
最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
案例...
4、运算符
基本语法
案例:
写一个两数相加
计算(2+3)*4的值

“$((运算式))”或“$[运算式]”
#!/bin/bashsum=$[$1+$2]echo sum=$sum

5、条件判断
基本语法
常用判断条件
两个整数之间比较
-ep等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less equal)
-gt大于(greater than)
-ge大于等于(greater equal)
按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件
-d 文件存在并且是一个目录
案例...
test [condition][ condition ] 前后都有空格
注:如果是字符串之间的比较,用等号“=”判断相等,用“!=”判断不等
6、流程控制
6.1、if判断
基本语法
单分支
if [ 条件判断式 ]; then程序fi或者if [ 条件判断式 ]then程序fi多分支
if [ 条件判断式 ]then程序elif [条件判断式]then程序else程序fi
6.2、case语句
基本语法
case $变量名 in"值1")如果变量的值等于值1,则执行程序1;;"值2")如果变量的值等于值2,则执行程序2;;...省略其他分支...*)如果变量的值都不是以上的值,则执行此程序;;esac
注意:
case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
双分号“;;”表示命令序列结束,相当于C++中的break。
最后的“*)”表示默认模式,相当于C++中的default。
6.3、for循环
基本语法1
for (( 初始值;循环控制条件;变量变化))do程序done案例
#!/bin/bashsum=0for (( i=0;i<=$1;i++ ))dosum=$[$sum+$i]doneecho $sum
结果:

基本语法2
for 变量 in 值1 值2 值3...do程序done案例

6.4、while循环
基本语法
while [ 条件判断式 ]do程序done案例
a=1while [ $a -le $1 ]do# sum2=$[ $sum2 + $a]# a=$[$a + 1]let sum2+=alet a++doneecho $sum
7、read读取控制台输入
基本语法
read (选项) (参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待
参数
变量:指定读取值的变量名
8、函数
8.1、系统函数
8.1.1、basename
基本语法
basename[string/pathname][suffix]
功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename可以理解为取路径里的文件名称
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
案例

8.1.2、dirname
基本语法
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。
Dirname 可以理解为取文件路径的绝对路径名称。
案例
获取qint.txt文件的路径

8.2、自定义函数
基本语法
[ function ] funname[()]{Action;[return int;]}技巧
必须在调用函数地方之前,先声明函数,Shell脚本时逐行运行,不会像其他语言一样先编译。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
9、正则表达式
使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。
9.1、常规匹配
一串不包含特殊字符的正则表达式匹配它自己,

就会匹配所有包含root的行。
9.2、常用特殊字符
特殊字符:^
^ 匹配一行的开头,
会匹配出所有以r开头的行。特殊字符:$
$ 匹配一行的结束,

会匹配出所有以n结尾的行。
特殊字符:.
. 匹配一个任意的字符,

会匹配r..t的所有行。
特殊字符:*
不单独使用,它和上一个字符连用,表示匹配上一个字符0次或多次,

会匹配rt,rot,root等所有行。
字符区间(中括号):[]
[] 表示匹配某个范围内的一个字符,例如:
[6,8] 匹配6或者8
[0-9] 匹配一个0-9的数字
[0-9]* 匹配任意长度的数字字符串
[a,z] 匹配一个a-z之间的字符
[a-z] 匹配任意长度的字母字符串
[a-c, e-f] 匹配a-c或者e-f之间的任意字符
特殊字符:\
\表示转义,并不会单独使用,由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时,就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身。
10、文本处理工具
10.1、cut
在文件中负责剪切数据用的,cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符、字段输出。
基本用法
cut [选项参数] filename选项参数说明
-f 列号,提取第几列-d 分隔符,按照指定分隔符分隔列,默认时制表符“\t”-c 按字符进行切割,后加n表示取第几列
10.2、awk
把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法
awk [选项参数] '/pattern1{action1} /pattern2/{action2}...' filenamepattern 表示awk在数据中查找的内容,就是匹配模式action 在找到匹配内容时所执行的一系列命令选项参数说明
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
上面差不多就把Shell相关的一些基础整完了,如果需要更多实践,还是需要自己找点东西做做,毕竟是一个脚本语言,就是在我们工作过程中提高工作效率的。
将一些繁琐的步骤写成脚本自动化运行还是很有必要的,后边还会有Python的一些总结,还希望大家多多支持。




