shell 脚本变量 (二)

发布时间:2024年01月24日

一、Shell脚本变量简介

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

1、变量的作用?

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

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

2、变量名要求

①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)

②定义变量时,变量名要求:

变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放路径等。

变量名不能以数字开头,且不支持短横线 -。

变量命名要求

区分大小写

不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

大驼峰 StudentFirstName

小驼峰 studentFirstName

下划线 student_name

3.常见 Shell 变量的类型包括:

1、自定义变量:由用户自己定义,修改和使用

2、预定义变量:Bash中内置的一类变量 ? ?shell ? ? ? ? 不能修改 ? ?规定好的变量 放在那里让你使用

3、环境变量:由系统维护,用于设置工作环境 ?

4、只读变量:只可以读取不可以更改 ?

变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启

5、位置变量:通过命令行给脚本传递参数

6、系统内置变量:PATH,UID,HOSTNAME,USER

1、自定义变量:

1.自定义变量

定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)

变量名以字母或者下划线开头,区分大小写,建议全大写,长度不超过20个。

2.调用变量? ?
echo $变量名   
3.删除变量

unset? ?变量名

4.变量追加值

变量名+=追加值

自定义变量

方式一:变量名=变量值

方式二:交互的方式去定义变量

5.? ? read -p? ? ? 从键盘输入的内容变成变量
? ? ? ? ? ? ? ? ? ? (?交互的方式去定义变量)

2.设置变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用

方法:

  1. 格式1:export 变量名

  2. 格式2:export 变量名=变量值

可以使用pstree 查看shell的环境,输入bash进入子shell,ctrl+D组合exit 退出子shell

新定义的变量加export ,设为全局变量,在所有的子shell环境中都可以继续使用

3.整数的运算

expr? ? ? 只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:

加法 ?+

减法 -

乘法 ?\ *

除法 ?/

取余 (取模)%?

实验1:

实验2:

let var=算术表达式
let sum=1+2
sum=1+2

实验3:

 ((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum

实验4:

 var= $[算术表达式]

计算方式随你挑哈

也可以这样:

随机数生成器变量:

$RANDOM ? 取值范围:0-32767

[root@localhost ~]#man bash




$[RANDOM%33+1]
[root@localhost ~]# echo $[RANDOM%34+1]
9
[root@localhost ~]#echo -e "\E[1;30mhello\E[0m"
#颜色
[root@localhost ~]# echo -e "\E[1;$[RANDOM%7+31]mhello\E[0m"
#随机颜色
[root@localhost ~]#echo $(expr $RANDOM % 33 + 1)
#注意运算符附近都要有空格

[root@localhost ~]# echo $[RANDOM%3]? ? ?它的范围是0到2

[root@localhost ~]# echo $[RANDOM%3+1]?

颜色? ?[root@localhost ~]#echo -e "\E[1;30mhello\E[0m"??

我们来提取下系统信息

#!/bin/bash
host=`ifconfig ens33|grep netmask|tr -s " "|cut -d" " -f3`
name=`hostname`
cpu=`lscpu|grep 型号名称|tr -s " "|cut -d" " -f2-8`
ke=`uname  -r`
os=`cat   /etc/redhat-release`
disk=`lsblk |grep disk|tr -s " " |cut -d" " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`

echo  -e "\E[1;32m--------------------system info-------------------------\E[0m"


echo    "主机名:     $name"
echo    "IP地址:     $host"
echo    "cpu型号:    $cpu"
echo    "内核版本:   $ke"
echo    "系统类型:   $os"
echo    "磁盘大小:   $disk"
echo    "内存大小:   $mem"


echo  -e "\E[1;32m-----------------------end---------------------------------\E[0m"

提取信息:

编辑脚本:

英文版提取系统信息
#!/bin/bash
RED="\E[1;31m"
GREEN="\E[1;32m"
END="\E[0m"


echo -e ?"$GREEN----------------------Host systeminfo--------------------$END"
echo -e ?"HOSTNAME: ? ? $RED`hostname`$END"
echo -e ?"IPADDR: ? ? ? $RED` ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]
{1,3}' |head -n1`$END"
echo -e ?"OSVERSION: ? ?$RED`cat /etc/redhat-release`$END"
echo -e ?"KERNEL: ? ? ? $RED`uname -r`$END"
echo -e ?"CPU: ? ? ? ? $RED`lscpu|grep '型号名称:'|tr -s ' '|cut -d : -f2`$END"
echo -e ?"MEMORY: ? ? ? $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e ?"DISK: ? ? ? ? $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
echo -e ?"$GREEN---------------------------------------------------------$END"
~       

4.环境变量

环境变量:
  1. 由系统提前创建,用来设置用户的工作环境

  2. 可以使用env查看环境变量

  3. 需要记住的常用环境变量

环境变量:

可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径

环境变量的全局配置文件:

配置文件位置在? ?/etc/profile? 如果修改此文件会作用于所有用户

~/.bash_profile ?用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

切到opt文件夹下去做,这里忘记切换了,或者data都可以

相当与opt 就是一个环境变量了

5.只读变量

变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启

6.位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

7.预定义(状态)变量

bash ? 帮你定义好了 ?拿来用就可以了,你不需要知道为什么,记住

?$*? ?表示所有位置参数的内容看成一个整体返回 ? ? ?返回所有 ? ? ? ? ?
$@??表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 ? 返回所有 ?
$?? ?表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#? 表示命令行中位置参数的总个数
$0? 表示当前执行的脚本或程序的名称 ? ? 当前脚本的名字
$$? 当前bash的进程id ? ?
$!? ?后台任务最后一个id

$?? ?表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

$#? 表示命令行中位置参数的总个数

$0? 表示当前执行的脚本或程序的名称 ? ? 当前脚本的名字

$@ 与 $*

二、条件语句

测试:

1. () {}

2.test 测试文件的表达式 是否成立

格式1:test ?条件表达式
格式2:[ ?条件表达式 ?]


注意[ ]空格,否则会失败
测试 是否成功使用 $? ?返回值
[ 操作符 文件或目录 ]
help test

操作符:
-d:测试是否为目录(Directory)


-e:测试目录或文件是否存在(Exist)?

?
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)


-w:测试当前用户是否有权限写入(Write)


-x:测试当前用户是否有权限执行(eXcute)


-L: 测试是否为软连接文件

属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

测试过程,实现评估布尔声明,以便用在条件性环境下进行执行

若真,则状态码变量 $? 返回0

若假,则状态码变量 $? 返回1

条件测试命令

3.比较整数数值

[ 整数1 -操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数

  • -ne:第一个数不等于(Not Equal)第二个数

  • -gt:第一个数大于(Greater Than)第二个数

  • -lt:第一个数小于(Lesser Than)第二个数

  • -le:第一个数小于或等于(Lesser or Equal)第二个数

  • -ge:第一个数大于或等于(Greater or Equal)第二个数

实验:

4.字符串比较

常用的测试操作符

  • =:字符串内容相同

  • !=:字符串内容不同,! 号表示相反的意思

  • -z:字符串内容为空

  • -n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

5.逻辑测试(短路运算)

格式1∶	[ 表达式1 ] 操作符 [ 表达式2 ]…
格式2∶	命令1 操作符 命令2…

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真

  • -o或||:逻辑或,“或者”的意思一真即为真

  • !:逻辑否

操作符:

&&或-a? 表示且的意思,前面表达式或命令1为真才会执行操作符后面的表达式2或命令2。一假则为假。

||或-o? ?表示或的意思,前面表达式1或命令1为真则整个表达式为真,前面表达式为假或命令为假才会执行后面的表达式2或命令2?。一真则为真。

例如:

实验:

如果你不想放到垃圾邮箱

#会给你一串密码:比如 zqvvpycmrhoubefa

[root@localhost ~]#vim /etc/mail.rc
#将已下段加入到邮箱中
set from=940132245@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=940132245@qq.com
set smtp-auth-password=zqvvpycmrhoubefa

[root@localhost ~]# echo "hello wolrd" |mail -s test 360601212@qq.com
#                         你要发送的信息 | 使用邮件 -s 标题   发送方

6.双中括号

[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
?注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
?注意: 此表达式用于[[ ?]]中;扩展的正则表达式

#通配符
[root@centos8 ~]#FILE=test.log
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
0
[root@centos8 ~]#FILE=test.txt
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
1
[root@centos8 ~]#[[ "$FILE" != *.log ]]
[root@centos8 ~]#echo $?
0

文章来源:https://blog.csdn.net/zzzxxx520369/article/details/135769732
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。