shell 编程入门

CLI(命令行)

  command line,指我们通过输入命令来操控计算机的一种形式。在某种程度上来说,用CLI比用GUI更加炫酷、专业以及迅速。

GUI(图形化用户界面)

  Graphical User,指我们通过图形化如windows的操作系统或终端操作计算机

shell

  在计算机科学中,shell又叫壳,Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。在某种意义上来说,一行shell干的事情比几百行C还要多

定义&使用 变量

  定义变量时,使用 变量名=变量初始值 的形式定义变量,如:

para="jiajun"
para='jiajun'
para=jiajun

  需要注意的是shell是弱类型的语言,所有变量存储都是字符串形式,就算你声明时 a=1 ,它存储的时候还是字符的1

  使用变量时需要在变量名前加$,变量名可以用大括号括起来,帮助编译器识别

  例如 echo $AB,编译器就会识别成输出变量AB的值,而不是A的值后面加个字符B,应该写成${A}B才行

shell的特殊变量

  在shell中有一些特殊的且常用的变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面有写区别
$? 上个命令的退出状态,或函数的返回值
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

shell中的比较

  shell中分算数比较和字符比较,纯算数比较用-eq等命令

 

-eq 

     等于,如:if [ "$a" -eq "$b" ]

-ne   

   不等于,如:if [ "$a" -ne "$b" ]

-gt  

    大于,如:if [ "$a" -gt "$b" ]

-ge  

    大于等于,如:if [ "$a" -ge "$b" ]

-lt   

   小于,如:if [ "$a" -lt "$b" ]

-le  

    小于等于,如:if [ "$a" -le "$b" ]

<   

   小于(需要双括号),如:(("$a" < "$b"))

<=  

    小于等于(需要双括号),如:(("$a" <= "$b"))

>   

   大于(需要双括号),如:(("$a" > "$b"))

>=  

    大于等于(需要双括号),如:(("$a" >= "$b"))

 

  字符串的相等与否则用 = 、 == 或 !=,不同之处在于[]里面 = 就是判断字符串是否相等,==则是可以由正则表达式进行匹配

shell的各种区别

$*和$@的区别

  $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

  但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

[ ]和[[ ]]的区别

  [ ]为test命令的另一种形式,需要注意的是表达式的左右两端都要留空格,用数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较

  [[ ]]为[ ]的加强版,可以使用~=进行模式匹配判断是否相等,同样需要左右两端留空格

单引号和双引号的区别

  以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景

   以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

$( )和${ }的区别

  前者是命令替换,是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。值得一提的是用反引号`包裹也可以实现命令替换的效果

  后者上面有说是变量替换,更好的识别变量名的边界

$( )和$(( ))的区别

  上面有说$( )是命令替换,而$(( ))则是在里面的变量可以不用$来替换,且可以直接进行数值运算,无需使用expr语句

a=1 b=2 c=3
echo $((a+b+c))

一些常用的命令详解

declare

  declare命令用于声明变量

declare [+/-][rxi][变量名称=设置值] 或 declare -f

grep

  grep命令的常用格式是 grep  [选项]  "模式"  [文件]

  常用选项:

-E 开启扩展(Extend)的正则表达式。
-i 忽略大小写(ignore case)
-v 反过来(invert),只打印没有匹配的,而匹配的反而不打印
-n 显示行号
-w 被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c 显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到
-o 只显示被模式匹配到的字符串
--color 将匹配到的内容以颜色高亮显示
-A  n 显示匹配到的字符串所在的行及其后n行,after
-B  n 显示匹配到的字符串所在的行及其前n行,before
-C  n 显示匹配到的字符串所在的行及其前后各n行,context

  模式部分可以直接输入要匹配的字符串,也可以使用正则表达式进行匹配

sed

  sed 可依照脚本的指令来处理、编辑文本文件

  sed命令的格式是 sed [选项] [动作]

  选项

-n 使用安静(silent)模式
-e 直接在命令列模式上进行 sed 的动作编辑;
-f 直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i  直接修改读取的文件内容,而不是输出到终端。

  动作

a 新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c 取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d 删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i 插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p 列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s 替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

  详情请进sed样例教程传送门

awk

  awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

  太多了以后再研究(doge)

tail

  tail 命令可用于查看文件的尾部内容,默认情况下它显示文件的最后十行。常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化。与tail命令对应的是head命令,用来显示文件头部内容。

  格式:

 

tail [参数] [文件名]

 

  参数:

-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent  从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

cut

  cut命令用于分割显示文件内容

  语法:

cut  [参数] [file]

  参数:

-b 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c 以字符为单位进行分割。
-d 自定义分隔符,默认为制表符。
-f 与-d一起使用,指定显示哪个区域。
-n 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除

 

posted @ 2022-01-18 19:34  艾尔夏尔-Layton  阅读(80)  评论(0编辑  收藏  举报