zl程序教程

您现在的位置是:首页 >  其他

当前栏目

shell - 01 - Shell入门:扎好马步 走的更稳

2023-09-14 09:14:27 时间

自定义变量

在任何编程语言中,变量都是一个基础的适用方法,这些变量代表某些逻辑运算后的值,也可以对这些变量进行自定义,比如声明变量就是一个常量字符串或者某些特定的值。

唯一不同的是,在高级语言中,变量属于强类型的,在高级语言中,定义一个变量后,在内存中这个变量的数据、格式、类型就固定了。

但是在shell中,变量是属于弱类型的,因为shell是解释型语言,只有在解释器实际执行中执行变量的时候才会决定变量的数据类型是什么类型的。

变量名遵循原则

变量是由任何字母、数字和下划线组成的字符串,且不能以数字开头。[这一点与高级语言是一样的]

区分字母大小写,例如Age1、Book2。[建议shell中尽量使用大写的变量,便于区分]

变量、符号、值中间不能出现任何空格

变量的引用

声明变量
VAR1=hello world

引用变量[引用时加上’$'符号]
echo $VAR1

再次注意: “=” 左右不能有空格

一个小案例

在这里插入图片描述

在这里插入图片描述

位置变量

什么是位置变量?

当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数

比如如下的命令

sh 1.sh hello world 123 456

我们就可以通过 $1 引用 hello、$2 引用world... 以此类推

位置参数变量

$n : n位数字,$0代表脚本本身,$1~$9 代表 第1~9个参数,10以上的参数需要大括号包含,如 ${10

$@ : 命令行所有参数,但是每个参数区别对待

$* : 命令行所有参数,所有的参数视为一个整体。这在某些极端的情形下会出现不同的效果

$# : 表示参数的个数

编写一个 location_var.sh 脚本

#! /bin/bash


echo "The First  Para: $1"
echo "The Secont Para: $2"
echo "The Third  Para: $3"
echo "The Fourth Para: $4"
echo "The Fifth  Para: $5"


echo $*
echo $@
echo $#

在这里插入图片描述

环境变量

了解即可,shell脚本中使用的并不是很多。

什么是环境变量?

Linux是一个多用户的操作系统,针对不同的用户都会有一个专有的运行环境。

不同用户的专有环境就是一组默认环境变量的组合。[这样解释并不准确,从专有环境来说可以延伸到内存隔离等等,但是现在这么理解也未尝不可。]

环境变量分类

对所有用户都生效的环境变量[系统级的变量],比如在 /etc/profile 设置的环境变量是对所有用户都生效的

对特定用户生效的环境变量,比如特定用户家目录下的 ~/.bashrc 或者 ~/.bash_profile 文件下的变量。这两个文件对于不同操作系统来说,可能只有一个或者两种都有,通常情形下找到任何一个在其中写入变量都会生效的。

临时有效的环境变量,比如脚本或命令行使用的 export。 有时候需要特定的用户启用特定的进程,而且启用这些进程的时候,可能需要特定的环境变量。这时候就可以用 export 定义这些临时的环境变量以被我们启动进程的时候使用

附:一般情况下在脚本中利用export定义很多变量,方便被其他命令所使用的

常见的环境变量

PATH : 命令搜索的路径
HOME : 用户家目录的路径
LOGNAME : 用户登录名
PWD : 当前所在路径
HISTFILE : 历史命令的保存文件
HISTSIZE : 历史命令保存的最大行数
HOSTNAME : 主机名
SHELL : 用户当前使用SHELL
PS1 : 一级命令提示符
TMOUT : 用户和系统交互过程的超时值
IFS : 系统输入分隔符
OFS : 系统输出分割符

管道

思考一个问题:我们现在想要查找目前系统中python相关的包,在不使用管道符的情况下?

解决方法之一:使用命令列出系统已有的所有的软件包,然后把结果重定向到文件中,然后在文件中搜索关键字python。
命令: rpm -qa > all_soft.txt [将系统资源安装的rpm包重定向到 all_soft.txt 文件]
在利用 vim 或者 less等命令查看 all_soft.txt 文件

那么如果使用 管道符 的情况下呢?
列出所有的python软件包,然后将结果传递给后续命令处理,并输出
命令:rpm -qa | grep python
如果再进行统计呢?
命令:rpm -qa | grep python | wc -l [输出 python 相关包的数量]

管道的定义

将一个命令的输出作为另一个命令的输入。

从某种意义上来说,其实就是一种重定向上的简易实现。[本质上就是一个过滤的功能]

rpm -qa | grep less

退出状态码

在shell脚本中,退出状态码使用的场景还是比较多的。

其实在shell命令中,每一条shell命令在执行结束之后都会得到一个"值",不管是正确的"值"还是非正确的"值"。

什么是退出状态码

所有的shell命令都使用退出状态码来告知shell,它已经执行完毕。退出状态码的不同,代表着执行结果的不同。

退出状态码是一个 0~255 的整数值

Linux提供了一个 $? 来捕获退出状态码的值

状 态 码                 含义
    0                   命令成功结束
    1                   一般性位置错误
    2                   不适合的shell命令
    126                 命令不可执行
    127                 没找到命令
    128                 无效的退出参数
    128+X               与Linux信号 X 相关的严重错误
    130                 通过 Ctrl + C 终止的命令
    255                 正常范围之外的退出

其实只需要记住 0 为成功,非 0 为不成功就好!

改变退出状态码的 exit 命令

现在我们都知道,其实 退出状态码 实际上是以上一条指令的返回结果为准。也就是说上一条指令执行结果直接决定了 退出状态码 的值。

其实在某些逻辑中我们可以使用 exit 来改变这一种默认的行为。

比如说,我们可以使用 exit $exit_code 改变一个具体的状态码。

exit 48 或者 exit 125

示例:

#!/bin/ash

date

if  [ $? -eq 0 ];then
    echo "Success..."
else
    echo "failed"
fi

在这里插入图片描述

再来看一个 错误状态码 的示例

#!/bin/ash

this is a error date

if  [ $? -eq 0 ];then
    echo "Success..."
else
    echo "this is a failed"
    exit 25
fi

echo $?

这里需要注意的是,当执行 exit 命令之后, 下面的 echo $? 将不再执行。

在这里插入图片描述

所以说 exit 也是一个脚本退出指令,在以后写脚本的过程中可以在脚本中去引用脚本的时候会用到 exit 的指令.