Linux中的shell---1

143 阅读4分钟

什么是shell?

事实上。Linux命令就是一种shell。

juejin.cn/post/713770…

由此可见,shell是用户与Linux操作系统沟通的桥梁

什么是shell编程?

shell编程就是把多个shell逻辑命令组合在同一个文件中,后面可直接执行该文件,该文件称为shell脚本。

第一个shell脚本

  • shell脚本文件名后缀通常是.sh
  • shell脚本第一行内容是
#!/bin/bash

注意

除第一行外的shell脚本,其它行以#开头表示注释

创建第一个shell脚本

步骤一 创建文件

mkdir 文件名

步骤二 把操作目录更换至文件目录

cd 文件名/

步骤三 脚本文件的创建及编写

vi 脚本名称.sh

执行shell脚本

格式

bash 脚本名称 sh 脚本名称

bash命令对应的是bin目录下的bash文件

而sh命令对应的是bin目录下的sh文件,sh文件是一个连接文件,指向bash文件

执行权限问题

通过ll命令我们可知,shell文件没有执行权限

那为什么我们可以在shell里面执行shell脚本呢?

原因是:我们在前面加上了bash/sh命令,把shell脚本作为参数,传入bash文件执行

添加执行权限

chmod u+x 脚本

拥有执行权限后,我们可以直接使用命令简写来执行脚本

 ./脚本名

命令中.是指当前目录

这里有个坑

如果我们直接输入文件名,会发现系统抛出command not found的错误,原因是Linux默认是在PATH环境变量下寻找脚本,而不是当前目录下

Linux path环境变量配置

shell脚本的单步执行

方便脚本调试

bash -x: 

shell中的变量

  • shell变量不需要声明,初始化也不需要指定类型

shell是一门弱类型语言

  • 变量命名:只能使用数字、字母和下划线,且不能以数字开头
  • 变量赋值是通过"="进行赋值,在变量、等号和值之间不能出空格

创建变量

变量名=值

打印变量

echo $变量名
echo ${变量名}

若想在某个变量后无缝拼接另一个变量,选择使用后者

也可以在第一个命令后加空格,但不达到无缝拼接

变量的分类

本地变量

格式

变量名=值

应用场景

在shell脚本中定义一些临时变量时使用,对当前shell进程的子shell进程及其它shell进程无效

对其它shell进程无效

运行pstree命令,查看进程

pstree命令默认未安装

当前进程数为3,把另外一个进程关掉后,进程数为2

进入子进程

bash

对子进程无效

退出子进程

exit

环境变量

格式

export 变量名=值

应用场景

用于设置临时环境变量,对子shell进程有效,对其它shell进程无效

注意

设置永久环境变量,需要添加到配置文件/etc/profile中,然后执行source /etc/profile可立刻生效

添加至/etc/profile中可对于所有用户生效

再次运行echo

原因分析

由于开始shell进程时,默认已经打开etc/profile/文件,上述更改是进程打开后的更改,未重新加载文件

解决

source /etc/profile

位置变量

位置变量相当于Java中main函数的args参数,可以在shell脚本中动态获取外部参数

location.sh文件

$0 $1 $2

格式

location.sh 字符串

$0打印文件名称 1打印abc1打印abc 2打印xyz

字符串参数数量对应在行数的角标

应用场景

给shell脚本传输动态参数时,需要用到位置变量

特殊变量

$?:上一条命令的返回状态码,状态码在0~255之间

$#: shell脚本所有参数的个数

paramnum.sh内容

应用场景

需要动态获取多个参数时,在执行脚本前确认参数个数

变量和引号的特殊使用

  • ":单引号不解析变量
echo '$name'

  • "": 双引号解析变量
echo "$name'"

  • ``:反引号是执行并引用命令的执行结果echo `$name'

$name为peiqi,执行语句peiqi未能正常执行

$name为pwd,执行语句pwd获取当前路径信息

  • $(...)是的另一种写法,效果一样

注意

echo '"$name"'
echo "'$name'"

shell脚本中的逻辑判断

for循环

格式1

for((条件))
do
循环体
done

格式2

for 变量名称 in 列表  # 列表元素之间以空格间隔
do
循环体
done

while循环

适用于循环次数未知,或不便于使用for直接生成较大列表时

格式

while 测试条件
do
测试体
done

测试条件

格式: test EXPR或者[ EXPR ]中括号和表达式之间的空格不能少

整型测试: -gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于)

字符串测试:=(等于)、!=(不等于)

退出按ctrl+c

异常原因:[后和]前没有空格

if判断

  • 单分支
if 测试条件
then
    选择分支
fi

不传参数会报错

  • 双分支
if 测试条件
then
    选择分支1
else
    选择分支2
fi

if 测试条件1
then
    选择分支1
elif 测试条件2
then
    选择分支2
    .…·
else
    选择分支n
fi