欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

shell脚本入门 —— 符号篇

程序员文章站 2022-07-12 12:31:05
...

一、什么是shell

Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。
Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲 命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,包括循环和分支。但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。作为程序设计语言,它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

linux系统中常见的shell有:sh、csh、tcsh、bash
使用命令: cat /etc/shells 可以查看当前系统支持的bash
shell脚本入门 —— 符号篇

二、shell执行脚本

1.建立一个shell脚本

vim testshell.sh
#!/bin/bash
echo "hallo world"

shell脚本通常以“ .sh”结尾,并不是系统规定,而是一种业界规范

2.shell脚本执行方式

//第一种执行方式:
[root@initiator Desktop]# sh testshell.sh 

//第二种执行方式:
[root@initiator Desktop]# chmod +x testshell.sh 
[root@initiator Desktop]# ./testshell.sh

shell脚本入门 —— 符号篇

3.脚本编写规范

脚本中应该有脚本的说明信息,
下面的例子是vim自动添加脚本说明
vim /etc/vimrc 
 67 map <F4> ms:call AddTile()<cr>'s        ##设定快捷键为F4
 68 function AddTile()                      ##设定函数
 69         call append(0,"#!/bin/bash")
 70         call append(1,"###############################")
 71         call append(2,"#Author          :Lee")
 72         call append(3,"#Email           :aaa@qq.com")
 73         call append(4,"#Version         :")
 74         call append(5,"#Creat_date      :".strftime("%y-%m-%d"))
 75         call append(6,"#Description     :")
 76         call append(7,"###############################")
 77 endfunction

三、shell变量

 shell变量不需要进行任何声明,直接定义即可,因为shell变量的值实际上都是字符串(对于没有定义的变量默认是一个空串)。定义的时候shell变量由大写字母加下划线组成,并且定义的时候等号两边不能存在空格,否则会被认为是命令!

1.shell变量的种类:

环境变量:shell进程的环境变量只在当前环境生效,但可以从当前shell进程传给fork出来的子进程,当前环境关闭则变量失效。
本地变量:只针对配置过的用户生效,其他用户无法使用
系统变量:

利用printenv可以显示当前shell进程的环境变量;利用set命令可以显示当前shell进程中的定义的所有变量(包括环境变量和本地变量)和函数。

一个shell变量定义后仅存在于当前Shell进程,是一个本地变量。用export命令可以把本地变量导出为环境变量。用unset命令可以删除已定义的环境变量或本地变量。

//分步  先定义后导出
COUNT=5
export COUNT

//一步完成定义和导出环境变量
export COUNT=5 

//删除已经定义的环境变量
unset COUNT

变量引用:

引用shell变量要用到$符号,加{}可以防止歧义。

例如:

COUNT=5
echo $COUNT
echo ${COUNT}911

四、通配符 Globbing、命令代换、单引号、双引号

1.常见的通配符:


//  * : 匹配0个或多个任意字符

//  ? : 匹配一个任意字符

//  [若干字符] : 匹配方括号中任意一个字符的一次出现

2.命令代换:

反引号``  或者  $()

shell会先执行反引号或$()中的命令,将结果代换到当前命令行中!

反引号和$()的区别:

反引号本身就对\进行了转义,保留了本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。

反引号中: \\ = \

$()中:\ = \



算数代换:$(())

例如:将10-2的结果赋给SUB,并显示本地变量SUB
SUB=$((10-2))
echo $SUB

3.单引号和双引号

Shell脚本中的单引号和双引号一样都是字符串的界定符,单引号用于保持引号内所有字符的字面值,而双引号有些情况则特殊。如果字符串中有特殊字符需要处理时就用双引号。

注:单引号标注的字符中不能再出现单引号。

举个例子:
#!/bin/bash

echo '\\'
echo "\\"
echo '`date`'
echo "`date`"

五、diff命令

diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

diff(选项)(参数)
[num1,num2][a|c|d][num3,num4]
    a ##添加
    c ##改变
    d ##删除
    num1,num2 ##表示在文件1中的行号
    num3,num4 ##表示在文件2中的行号
    以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1,以>开始的行属于文件2。
diff常用于打补丁,序言安装patch
yum install patch -y        ##安装补丁软件
diff file file1>file.path   ##生成补丁文件file.path
patch file file.path        ##给file打补丁
##或者
patch -b file file.path     ##-b表示备份源文件为file.orig