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)
- 刚创建一个文件后,默认是没有可执行权限的。
- 执行
chmod +x shell文件路径
,赋予执行权限。 - 使用相对路径或绝对路径进行访问。
方法二:指定Shell来解释脚本,不要求文件必须有 x 可执行权限。
sh 脚本文件路径 / bash 脚本文件路径
或
source 脚本文件路径
或
. 脚本文件路径
注意:上图会发现使用 source
和 .
后会切换当前真实所在的目录位置,是因为这两个命令是在当前的bash shell环境中执行shell文件中内容的,相当于把cd 命令拿出来执行。而直接访问和sh、bash
是在脚本文件中的shell环境中执行的shell文件中的内容的,只是把结果拿出来展示而已。是不同的环境。
三、重定向和管道符号
3.1 重定向
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据,从右到左;
- 标准输出:通过该设备向用户输出数据,从左到右;
- 标准错误:通过该设备报告执行出错信息。
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
输出默认是输出到屏幕上,可以通过重定向输出到文件中。
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > >> | 将标准输出结果保存到指定的文件,并且 覆盖 原有内容; 将标准输出结果 追加 到指定的文件的尾部 |
标准错误输出 | 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+0,0会被当成字符串
记得要给脚本可执行权限!!!
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入门变量的使用的主要内容,如果未能解决你的问题,请参考以下文章