一文讲清楚 Linux Shell 编程

1. 什么是Shell?什么是Shell脚本?

  • 从字面来看,shell是外壳的意思,Linux shell即linux内核的外壳,提供给用户操作内核的接口;
  • 从实现来看,shell是一个命令解释器,从标准输入接收用户命令,将命令进行解析并传递给内核,内核则根据命令,作出相应动作,如果有反馈信息,则输出到标准输出上,如图:


因为shell命令一条一条手动执行过于麻烦,通常使用shell脚本来批量执行命令,shell脚本一般以.sh作为后缀,在编写shell脚本的时候除了普通的shell命令之外,还规定了一些shell脚本特有的语法,所以shell也指shell脚本编程语言。

shell脚本在编写的时候,首先在最开始以#!指定该脚本文件的使用的解释器,如:

#!/bin/bash
#!/bin/ksh

另外,shell脚本将#开头的行作为注释内容。

shell脚本编写完成之后,有三种方法执行:

① 在当前shell环境下读取并执行:

source <filename>
. <filename>

② 新建一个子shell,继承当前shell(父shell)的所有环境变量,但是子shell改变的变量不会被带回父shell:

sh <filename>
bash <filename>
ksh <filename>

③ 新建一个子shell执行(要求shell脚本必须具有可执行权限):

./filename

2. Shell变量

使用方法:

#变量赋值,默认字符串赋值,不能有空格
<变量名>=变量值

#变量引用
$<变量名>

2.1. 用户自定义变量

#!/bin/bash

var=1
var=$var+1
echo $var

执行结果:

2.2. 环境变量

shell的环境变量由系统维护,用于设置用户的shell工作环境,如:

export <环境变量名>
export <环境变量名>=<环境变量值>

注意,使用export说明的变量,在shell以后运行的所有程序或者命令都可以访问,但是如果是子shell方式执行,该环境变量不会被带回到原来的父shell中

常用的环境变量:

  • HOME:当前用户的主目录;
  • PATH:用冒号分隔的目录路径名;
  • TERM:终端类型;
  • HOSTNAME:主机名称;
  • SHELL:当前使用的是哪种shell;
  • PWD:当前工作目录的绝对路径名;

2.3. 位置参数变量

位置参数可以用来从shell脚本执行命令接收参数,语法如下:

  • $1:表示跟在脚本名后面的第1个参数值;
  • $9:表示跟在脚本名后面的第9个参数值;
  • ${10}:表示跟在脚本名后面的第10个参数值;


如果参数包含空格,则使用引号包含起来

2.4. 专用参数变量

命令行参数相关:

  • $0:命令行上输入的shell程序名;(需要使用第三种方式执行才可以)
  • $#:输入参数的个数


进程状态相关:

  • $$:当前进程的进程号;
  • $!``:显示运行在后台的最后一个作业的PID;


返回状态相关:

  • $?:显示上一条命令执行之后的返回值;

返回值有:

  • 0:执行成功;
  • 1-255:执行不成功;
  • 1:通用错误;
  • 126:命令或脚本没有执行权限;
  • 127:命令没找到;

3. Shell常用内置命令

3.1. echo

打印一行内容:

echo <打印内容>
参数 作用
-n 不要打印结尾的换行
-e 解释反斜杠转义符
-E 不解释反斜杠转义符

3.2. export

打印当前所有环境变量:

export

设置一个环境变量:

export <变量名>=<变量值>

3.3. eval

将所有的参数连接成一个表达式,并执行或者计算该表达式。

3.4. read

从键盘输入内容为变量赋值:

read [-p "提示信息"] [var1 var2 ...]

如果没有指定变量,则默认读取到REPLY变量中。

如果使用readonly,则该变量之后不能被清除或者重新赋值

3.5. shift

将位置参量列表依次左移n次,默认移动1次,一旦移动,最左边的那个参数就会被从列表中删除

shift [n]

3.6. declare

可以来显示声明一个变量:

declare [选项] <变量名>[=<变量值>]

选项:

选项 作用
-r 将变量设为只读
-x 将变量输出到子shell中
-i 将变量设为整型
-a 将变量设置为一个数组
-f 列出函数的名字和含义
-F 只列出函数名

3.7. 数学运算命令

let用于算术运算;
expr为通用的表达式计算命令;
printf按照指定的格式输出

3.8. 退出

退出脚本或者退出当前shell:

exit <退出值>

退出值的范围是0-255,0表示成功退出,其它表示失败,返回值保存在环境变量$?中。

4. Shell特殊字符

4.1. 一般通配符

  • *:匹配不限长度的多个字符;
  • ?:匹配任意一个字符;
  • []:匹配字符组所限定的任何一个字符;
  • !:匹配不在方括号中所列出的字符;

4.2. 模式表达式

  • *(模式表):匹配给定模式表中模式的0次或者多次出现,模式之间使用|分开;
  • +(模式表):匹配给定模式表中模式的1次或者多次出现,模式之间使用|分开;
  • ?(模式表):匹配给定模式表中任何一种模式的0次或者多次出现,模式之间使用|分开;
  • @(模式表):仅匹配模式表中给定模式的一次出现,各模式之间使用|分开;
  • !(模式表):除给定模式表中的一个模式之外,它可以匹配其它任何东西;

4.3. 引号

  • 双引号:双引号内的字符吗,除$、`、\仍保留其特殊功能外,其余字符均是普通字符;
  • 单引号:只要是单引号括起来的字符,全部当做普通字符处理;
  • 倒引号:倒引号括起来的字符串会被shell解释为命令行,在执行时,会以它的执行结果来取代整个倒引号部分;

4.4. 括号(重点)

  • ( ):命令组、结合$进行命令替换、初始化数组;
  • [ ]:字符范围、数组编号、算术运算、条件判断;
  • {}替换
  • (( )):算术运算、for循环中的算术运算;
  • [[ ]]:条件判断;

示例——变量的间接引用(二次引用)

错误引用:

str1 = "Hello World"
str2 = str1
echo $str2

结果:

正确引用方法1——适合于比较老的bash(\$$表示引用两次):

eval echo \$$str2


适用于bash 2.0以上:

echo ${!str2}

5. 整数运算

在bash中,shell变量一般都是字符串,若一个变量的值是纯数字的,不包含字母或者其它字符,bash可以将其视为长整型值,并可做算术运算和比较运算。

5.1. 方式1-算术运算扩展

$[express]
$((express))

比如:

整数运算的时候,变量前的$符号可省略。

5.2. 方式2-内置命令let

let "<expression>"

5.3. 方式3-内置命令expr

expr <expression>

其中:

  • 表达式中参数和运算符之间必须以空格分开
  • 括号、乘号*必须被转义

5.4. 格式化输出—printf

printf用来按照指定的格式输出变量:

格式符有:

转义符有:

补充—数组变量

declare -a var
var = (value1 value2 value3)

或者

var = (value1 value2 value3)
var[n]=value

数组数组的引用(第一个元素下标为0):

${var[n]}

列出数组中的所有元素:

echo ${var[*]}

列出数组中的元素个数:

echo ${#var[*]}

6. 条件测试

条件测试用于判断某个特定条件是否满足,在shell中,条件测试没有布尔值,只有退出命令执行退出状态:

  • 退出状态为0:表示命令成功或者表达式为真
  • 退出状态为非零值:表示命令失败或者表达式为假

退出状态在环境变量$?中。

条件测试语句(第一种和第二种语句是等价的):

test <测试表达式>
[ <测试表达式> ]
[[ <测试表达式> ]](bash 2.0 版本之后)

6.1. 文件测试操作符

作用:测试文件是否存在,文件的属性,文件的权限等。

6.2. 字符串测试

字符串按照从左到右对应字符的ASCII码进行比较:

6.3. 整数测试

单括号中两边必须是整数,否则报错,双括号不报错。

双小括号中,如果做数学运算,$符号可以省略;但是在双中括号中,不可以省略。

7. 流程控制

7.1. if

7.2. case

7.3. for循环

7.4. break和continue

break [n]

数字n表示退出第n重循环,最里面的为第1层循环。

continue [n]

7.5. while循环

7.6. until循环

8. 参数处理

9. Shell函数

函数的定义:

函数的调用:

函数必须在调用之前定义。

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

发布了271 篇原创文章 · 获赞 731 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/105193509