2022-06-21-Shell系列01丨 shell介绍与变量

一.shell介绍

1.什么是shell

通过编写shell命令发送给linux内核去执行,操作计算机硬件。所以shell命令是用户操作计算机硬件的桥梁。

shell是命令,类似于windows系统Dos命令

shell是一门程序设计语言,shell里面含有变量,函数,逻辑控制语句等等。

2.shell与linux内核关系:

20220621232021

3.shell脚本

通过shell命令或程序编程语言编写的shell文本文件,这就是shell脚本,也叫shell程序。

4.为什么学习shell脚本?

通过shell命令与编程语言来提高linux系统的管理工作效率。

5.shell运行过程

20220621232444

6.shell解析器

查看linux系统支持的shell解析器,默认bash

cat /etc/shells

打印输出当前系统使用的shell解析器类型

echo $SHELL

二.shell脚本文件编写规范

1.编写格式与执行方式

脚本文件后缀名规范.sh

首行格式规范

首行需要设置shell解析器的类型,语法

#!/bin/bash

含义:设置当前shell脚本文件采用bash解析器运行脚本代码

注释格式

单行注释

# 注释内容

多行注释

:<<!
# 注释内容
!

2.”hello world”demo

#!/bin/bash
echo "hello world"

3.脚本文件的常用执行3种方式

介绍

3.1 sh解析器执行方式

语法: sh test.sh

介绍:解释利用sh命令执行脚本文件,本质是使用shell解析器运行脚本文件

3.2 bash解析器执行方式

语法:bash test.sh

介绍同上

3.3 仅路径执行方式

语法:./test.sh

介绍:执行当前目录下的脚本文件

注意:脚本文件自己执行,需要具有可执行权限,否则无法执行

3.4 三种方式区别:

前两种方式直接使用shell解析器运行脚本文件,不需要可执行权限。仅第三种是执行脚本文件自己执行,需要可执行权限。

三.多命令处理

就是在shell文件中编写多个shell命令

#!/bin/bash
touch ~/one.txt
echo "Hellp world" >> ~/one.txt

四.变量

1.变量的介绍

变量用于存储管理临时的数据,这些数据都是运行内存中的。

2.变量类型

2.1 系统环境变量

是系统提供的共享变量,是linux系统加载shell配置文件中定义的变量,贡献给所有的shell程序使用。

全局配置文件:

/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件:

# 当前用户
/.bash_profile
/.bashrc

一般情况下,我们都是针对全局配置进行操作。

环境变量分类

在linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。

系统级环境变量:shell环境加载全局配置文件中的变量共享给所有用户所有shell程序使用。

用户级环境变量:shell环境加载个人配置文件中的变量共享给当前用户的shell程序使用。

查看当前shell系统环境变量

env

查看shell变量(系统环境变量+自定义变量+函数)

set

常用系统环境变量

20220626231359

2.2 自定义变量

分类:

  • 自定义局部变量

  • 自定义常量

  • 自定义全局变量

2.2.1 自定义局部变量

介绍:解释定义在一个脚本文件中的变量,只能在这个脚本文件中使用的变量,就是局部变量

变量定义规则:

  • 可以有字母,数字和下划线组成,但是不能以数字开头
  • 等号两侧不能有空格
  • 在bash环境中变量的默认类型都是字符串类型,无法直接进行数值运算
  • 变量的值如果有空格,必须使用双引号括起来
  • 不能使用shell的关键字作为变量名称

查询变量值语法

var_str=hello

# 方法1:直接使用变量名查询
echo $var_str
hello

# 方法2:使用花括号
echo ${var_str}
hello

两种方式的区别:花括号方式适合拼接字符串

20220626235327

变量删除

unset var_str

2.2.2 自定义常量

语法:

var_name=liming
readonly var_name
var_name=xiaomei

产量赋值后不可更改,修改会报错提示。 20220627000459

2.2.3 自定义全局变量

定义:就是在当前脚本文件中定义全局变量,这个全局变量可以在当前shell环境与子shell环境中都可以使用。

父子shell环境

例如:有两个shell脚本文件a.shb.sh,如果a.sh文件中执行了b.sh文件,那么a.sh就是父shell环境,b.sh就是子shell环境。

自定义全局变量语法

export var_str1 var_str2

demo实现

需求:测试全局变量在子shell中是否可用,在父shell中是否可用

1.创建demo1.sh,demo2.sh

2.编辑demo1.sh

命令1:定义全局变量var

命令2:执行demo2.sh脚本文件

#!/bin/bash
var="liyouqu"
# 设置为全局变量
export var
sh demo2.sh

3.编辑demo2.sh,输出全局变量var

#!/bin/bash
echo "data is $var"

4.执行demo1.sh脚本文件

此时可以看到demo2.sh可以读取到demo1.sh的全局变量。

20220627003657

注意:该全局变量的使用范围是这两个脚本文件中。

2.3 特殊符号变量

1. $n

含义:用于接收脚本文件执行时传入的参数

$0 用于获取档期那脚本文件名称

$1~$9,代表获取第1个输入参数到第9个输入参数

第10个以上的输入参数获取格式:${数值} ,否则无法获取

执行脚本文件传入参数语法

sh a.sh $1 $2 $3 ...

案例演示

#!/bin/bash

# 命令1:打印当前脚本文件名字
echo "当前脚本文件名称:$0"

# 命令2:打印第1个输入参数
echo "第一个输入参数:$1"

# 命令3:打印第2个输入参数
echo "第二个输入参数:$2"

# 命令3:打印第10个输入参数
echo "第十个输入参数:${10}"
echo "第十个输入参数:$10"

执行sh demo.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 cp

输出结果:

20220628233611

2.$#

含义:获取所有输入参数的个数

#!/bin/bash

# 打印所有输入参数的个数
echo "所有输入参数个数: $#"

执行sh demo.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 cp

输出结果:

20220628234034

3.$*$@

含义:都是获取所有输入参数,用于以后输出所有参数

$*$@区别:

1.不使用双引号括起来,功能一样,获取所有输入参数

2.使用双引号括起来:

"$*" 获取所有参数拼接为一个字符串,格式为 “$1 $2 $3 …”

"$@" 获取一组参数列表对象,格式为:”$1” “$2” “$3 …”

使用循环打印所有输入参数可以看出区别

案例演示

echo "当前脚本文件名称:$0"
echo "所有输入参数个数: $#"
# 实现直接输出所有输入后参数
echo '使用$*直接输出:'$*'
echo '使用$@直接输出:'$@'
# 使用循环打印输出所有输入参数"$*"
echo '循环遍历输出"$*"所有参数'
for item in "$*"
do
    echo $item
done
# 使用循环打印输出所有输入参数"$@"
echo '循环遍历输出"$@"所有参数'
for item in "$@"
do
    echo $item
done

20220710235219

4.$?

用于获取上一个shell命令的退出状态码,或者是函数的返回值。

每个shel命令的执行都有一个返回值,这个返回值用于说明命令执行时候成功。 一般来说,返回0代表命令执行成功,非0代表执行失败。

kangy1x@ubuntu:~$ echo "hello"
hello
kangy1x@ubuntu:~$ echo $?
0

5.$$

用于获取当前shell环境进程的ID号

kangy1x@ubuntu:~$ ps -aux | grep bash
999         6246  0.0  0.0  19512  5496 pts/0    Ss+  Mar09   0:00 bash
kangy1x   691229  0.0  0.0  19528  5308 pts/1    Ss   15:57   0:00 -bash
kangy1x   691294  0.0  0.0  17672   728 pts/1    S+   16:02   0:00 grep --color=auto bash
kangy1x@ubuntu:~$ echo $$
691229