Shell入门变量的使用

Posted 段小宝 

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell入门变量的使用相关的知识,希望对你有一定的参考价值。


一、Shell脚本概述

 Shell是一个特殊的应用程序,它介于Linux内核与用户之间,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,由内核去访问硬件,并返回执行结果。默认shell 是 /bin/bash 。
在这里插入图片描述

1.1 Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件中
  • 需要给该文件可执行权限(x)
  • 可结合各种Shell控制语句以完成更复杂的操作。

总结来说就是:将命令或操作写在shell文件中,配置后能够 手动/自动执行。

1.2 Shell脚本应用场景

  • 重复性操作,如重启某个服务;
  • 交互性任务,如输入 y 还是 n;
  • 批量事务处理,如创建几十个文件;
  • 服务运行状态监控,如查看服务端口
  • 定时任务执行,如凌晨两点结合crontab定时导出日志、定时查询服务状态;

1.3 Shell脚本解释器

Linux中有哪些Shell?

我们可以使用 cat /etc/shells 命令查看系统安装的shell脚本解释器。
在这里插入图片描述
这些shell都是依据 Linux 发行者的不同所创造出的不同版本:

  • bash:基准于GNU的框架下发展出的Shell。
  • csh:语法有点类似于c语言的shell。
  • tcsh:整合了csh,提供更多的功能。
  • sh:已经被bash所替换。
  • nologin:这个shell可以让用户无法登录主机。

bash (/bin/bash)是目前大多数Linux版本采用的默认Shell。

问:为什么系统上合法的shell要写入/etc/shells这个文件呢?

  • 因为系统某些服务在运行过程中,会去检查用户能够使用的Shell,检查的就是 /etc/shells 这个文件。

工作中可以使用:shell 脚本中去调用 python 脚本,也可以使用 python脚本中去调用 shell 脚本。

二、第一个Shell脚本

2.1 Shell 脚本的构成

1.脚本申明(解释器):若第一行是:“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行
#!/bin/bash为【默认解释器】。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。
2.注释信息:以“#”开头的语句,注意格式规范。
3.可执行语句:能够执行的 Linux 命令和表达式。

示例:
vim /root/first.sh        #新建一个脚本文件,一般脚本文件都以“.sh”结尾,方便辨识

#!/bin/bash               #用什么解释器去翻译脚本
#@Description:This is my first Shell-Script.    #注释信息
#@author: duan
#@date:2021-05-08
echo "当前的目录位置位于:"           #可执行语句
pwd

新建一个脚本文件
在这里插入图片描述

2.2 执行Shell脚本

方法一:直接访问文件,需要可执行权限(x)

  1. 刚创建一个文件后,默认是没有可执行权限的。
  2. 执行 chmod +x shell文件路径,赋予执行权限。
  3. 使用相对路径或绝对路径进行访问。
    在这里插入图片描述
    方法二:指定Shell来解释脚本,不要求文件必须有 x 可执行权限。
sh 脚本文件路径  / bash 脚本文件路径

source 脚本文件路径

. 脚本文件路径

在这里插入图片描述
 注意:上图会发现使用 source. 后会切换当前真实所在的目录位置,是因为这两个命令是在当前的bash shell环境中执行shell文件中内容的,相当于把cd 命令拿出来执行。而直接访问和sh、bash 是在脚本文件中的shell环境中执行的shell文件中的内容的,只是把结果拿出来展示而已。是不同的环境。

三、重定向和管道符号

3.1 重定向

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据,从右到左;
  • 标准输出:通过该设备向用户输出数据,从左到右;
  • 标准错误:通过该设备报告执行出错信息。
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

输出默认是输出到屏幕上,可以通过重定向输出到文件中。

重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据
重定向输出>
>>
将标准输出结果保存到指定的文件,并且 覆盖 原有内容;
将标准输出结果 追加 到指定的文件的尾部
标准错误输出2>
2>>
将错误信息保存到指定的文件,并且 覆盖 原有内容;
将错误信息 追加 到指定的文件的尾部,不覆盖原有内容
混合输出&>
&>>
2>&1
将标准输出、标准错误 保存 到同一文件中;
将标准输出、标准错误 追加 到同一文件中;
将标准错误输出重定向到标准输出

操作实例:

在这里插入图片描述
在这里插入图片描述
 我们在执行一些命令的时候会输出 命令执行的结果,我们可以使用 Linux 中的 黑洞文件 /dev/null 来 取消提示(丢弃掉提示信息)。
在这里插入图片描述
再比如:

ls -lh > log.txt 2>&1  
等同于 
ls -lh &> log.txt

本来ls -lh 直接输出的屏幕(等同于1指定屏幕);
1指向log.txt,是将标准输出结果保存到log.txt 
执行2>&1后,2指向1,而1指向log.txt,因此2也指向了log.txt,是将标准错误输出定义到标准输出信息中 
#标准输出到文件中,错误输出执行标准输出,将标准输出、标准错误 添加 到同一文件中

在这里插入图片描述

3.2 管道符号 |

  • 管道符号 “|” 是将 左侧的命令输出的结果,作为右侧命令的输入(处理对象);
  • 同一行命令中可以使用多个管道。

如:ls | wc -l

四、Shell 变量

1、变量的作用

作用:用来存放系统和用户需要使用的特定参数值

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2、变量的类型

类型解释
自定义变量由用户自己定义、修改和使用
环境变量由系统维护,全局生效,设置工作环境属性
位置变量通过命令行给脚本程序传递参数
预定义变量Bash中内置的一类变量,不能直接修改

4.1 自定义变量

4.1.1 自定义变量

  • 变量命名规则:字母数字下划线组成,只能以字母或下划线开头,区分大小写。格式:变量名=变量值

  • 查看变量的值,格式:echo $变量名

示例:
NAME=Python   #将右边的变量值赋予左边
VERSION=4.0      #VERSION=4.0

echo $NAME
echo $NAME $VERSION
echo ${NAME} ${VERSION}  #建议使用${} 表示变量名。 

在这里插入图片描述
变量赋值时,使用引号的注意点:

  • 双引号 "":允许通过 $符号 引用其他变量值;
  • 单引号 '':禁止引用其他变量值,$视为普通字符;
  • 反撇号 ``:命令替换,提取命令执行后的输出结果, 反撇号 和 $(…) 作用相同

在这里插入图片描述

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

使用 read 命令获取输入内容。

格式:read [选项] [选项值] 变量名

如:

read -p "请输入姓名:" NAME
#-n 后跟一个数字,定义输入文本的长度
read -n 5 -p "请输入英文名:" EN_NAME  #输入五个字母后自动结束该行输入
#-t 后面跟秒数,定义输入字符的等待时间。
read -t 10 -p "请输入年龄:" AGE  #无操作十秒后自动结束该行输入

在这里插入图片描述
或者在shell文件中写,然后访问这个文件,输入信息:
vim peopleMes.sh
在这里插入图片描述
在这里插入图片描述

4.1.3 变量作用范围

  • 默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为 局部变量。当进入子程序或执行 bash命令 进入新的Shell环境时,之前定义的局部变量将无法再使用。
  • 可以通过内部命令 export 将指定的变量导出为 全局变量,使用户定义的变量在所有的Shell环境中能够使用。

在这里插入图片描述
 按Ctrl+D组合键或输入 exit 命令退出子Shell环境,并在子环境下测试设置的全局变量是否生效。

 使用 pstree 查看当前bash环境。

设置全局变量
格式1:export 变量名
格式2:export 变量名=变量值

在这里插入图片描述

4.1.4 整数变量的运算

expr 表达式:

  • expr 只支持整数运算,浮点数不支持;
  • 表达式的运算符号与数值之间 需要使用空格隔开
  • 只有 expr表达式中的 ()*需要使用转义符,如: \\( 1 + 2 \\) \\* 3
格式:expr 变量1 运算符 变量2 [运算符 变量3]

常用运算符:
+     加法
-     减法
\\*    乘法(*代编其他意思,所以需要使用转义符 \\* 表示乘法)
/     除法
%     取余

a=`expr 1 + 1 ` #1+1=2 的值给变量 a

例子:
在这里插入图片描述

其他常用运算:

$[表达式]

常用的运算表达式:
echo $((10 / (1+1)))
echo $[10 / (1+1)]
let i=12*5

相关概念补充:
i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]

在这里插入图片描述
在这里插入图片描述

4.1.5 浮点数变量的运算

bash 不支持浮点运算,如果需要进行浮点运算,需要借助 bc, awk 处理

bc 运算

格式:bc [选项] [参数]     #这里的参数指的是文件
#很多时候使用管道符使用bc命令

直接使用 bc 命令
在这里插入图片描述
结合管道符号使用
在这里插入图片描述

awk 运算
在这里插入图片描述

4.1.6 删除变量

使用 unset 变量名删除变量,只读变量无法删除。

4.2 环境变量

  • 环境变量由系统提前创建,用来设置用户的工作环境;
  • 使用 env 命令查看工作环境下的已存在环境变量;
  • 全局配置文件为 /etc/profile,在此文件中定义的变量作用于所有用户;
  • 用户自己的配置文件为**~/.bash_profile**,此文件定义的变量仅作用于当前用户。

执行 env 命令后,能看到常用环境变量,比如:

  • USER:表示用户名称
  • HOME:表示用户的宿主目录
  • LANG:表示语言和字符集
  • PWD:表示当前所在的工作目录
  • PATH表示可执行程序的默认搜索路径

查看环境变量:echo $环境变量名
在这里插入图片描述
实验:将一个脚本文件添加到环境变量中:

vim peopleMes.sh

echo $PATH					#查看当前搜索路径
PATH="$PATH:/root/"			#将/root目录添加到搜索路径
export PATH="$PATH:/root"	#输出为全局环境变量
peopleMes.sh  #在当前shell的任何目录中都能执行这个shell文件了

在这里插入图片描述
目前设置只是临时生效,重启操作系统之后 PATH 就会还原,如果想要重启后仍然生效,需要 追加到 /etc/profile~/.bash_profile 文件中,单引号不识别 $ 符号,当字符串添加进去:

比如我的shell文件在 /root 目录下
在这里插入图片描述
可以使用,. /etc/profile 或 source /etc/profile , 重新激活这个文件中的命令。
在这里插入图片描述

4.3 只读变量

  • 变量值不允许被修改、不能被取消;
  • 使用 readonly 命令设置只读变量。
  • 取消只读需要重启系统
    在这里插入图片描述

4.4 位置变量

位置变量是系统自带的。

当执行命令行操作时,第一个字段表示命令本身,其余参数按照 从左到右的顺序依次赋值给位置变量

格式:$n #n为数字,
$0代表命令本身;
$1-$9代表带一个到第九个参数;
十以上的参数需要使用大括号表示,比如第十个参数为${10},不然会有歧义,会识别成 $1+00会被当成字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得要给脚本可执行权限!!!
在这里插入图片描述

4.5 系统已经预定义的变量

位置变量也是。

$*、$@:表示命令或脚本要处理的参数。
$*:把所有参数看成以空格分隔的一个字符串整体,表示: "$1 $2 $3 $4"
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立的,表示:"$1" "$2" "$3" "$4"

$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。	
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
$?也常被用于Shell脚本中return退出函数并返回的退出值。

在这里插入图片描述
在这里插入图片描述
其他预定义变量
在这里插入图片描述
在这里插入图片描述

五、实验:shell 实现多个文件压缩备份

思路,将多个文件名通过预定义变量传入到shell文件中。
在这里插入图片描述
此时opt目录下有三个文件了
在这里插入图片描述
将 abc.txt passwd shadow 添加到备份文件。
vim myback.sh
在这里插入图片描述
在这里插入图片描述

以上是关于Shell入门变量的使用的主要内容,如果未能解决你的问题,请参考以下文章

shell从入门到精通(21)如何引用其他shell定义的变量或者函数

Shell入门变量的使用

Shell脚本入门 02:变量与特殊变量

shell编程入门

shell脚本从入门到复杂其二(变量)

Bash的变量类型