shel脚本基础1——变量基础、脚本运算符

news2024/11/28 5:25:15

文章目录

  • 一、变量基础
  • 二、bash变量类型
  • 三、脚本基础知识
    • 3.1 脚本测试命令
    • 3.2 shell运算符
    • 3.3 命令逻辑关系
    • 3.4 bash条件判断
      • 3.4.1 条件测试的表达式
      • 3.4.2 整数测试
      • 3.4.2 字符测试
      • 3.4.3 文件测试
      • 3.4.4 组合测试条件

一、变量基础

变量的含义:

  • 变量可以通过变量名访问,变量通常是可以变化的量。

定义变量要求:

  1. 只能包含字母、数字、下划线,并且不能以数字开头。
  2. 不应该跟系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要用“_”下划线开头。
  3. 不能使用程序中的保留字,也就是shell内置的一些语法,例如if、for等。

变量类型:

  1. 字符型:字符串类型。
  2. 数值型: 整数型和浮点型。
  3. 布尔型:True和False。

变量操作:

  1. 设置变量:例如,a=10。
  2. 引用变量:例如,echo $a
  3. 撤销变量:例如,unset a

变量和单引号、双引号的关系:

  • 单引号表示变量本身。
  • 双引号表示变量值。

二、bash变量类型

  • 本地变量:作用域为当前shell进程。对当前shell外的其它shell进程,包括当前shell的父shell、子shell进程均无效,只能当前有效。
  • 局部变量:在本地变量前面加个local,代表作用域为当前代码段,常用于函数,例如 local qingjun=10

在这里插入图片描述

  • 环境变量:作用域为当前shell进程及其子进程,使用export定义。

在这里插入图片描述

  • 位置变量:用来引用脚本的参数。
  • 常用语句shift [num],多用于for循环,表示位置变量使用完以后退出,后面的参数向前推进。

在这里插入图片描述

  • 特殊变量:
    • $#:打印传给脚本参数的个数。
    • $0:打印脚本本身名字。
    • $@:打印传给脚本的所有参数的列表,单独个体存放,一个一个取。
    • $*:打印以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,当成一个整体存放,再一个一个取。
    • $! :表示shell最后运行的后台Process的PID。
    • $$:表示脚本运行的当前进程ID号。
    • $?:显示上条命令的退出状态,0表示没有错误,其他表示有错误。
  • bash内建环境变量
    • PATH:系统里面所有命令查找的位置。例如 echo $PATH。
    • SHELL:当前用的shell是什么,可以修改配置文件修改当前shell。
    • UID:当前用户的uid。
    • HISTSIZE:histtory命令显示长度。
    • HOME:当前用户的家目录。
    • PWD:当前所在的位置。
    • HISTFILE:history命令输出的内容存放文件地址。
    • PS1:定义命令提示符的样式。
##变量PATH:系统里面所有命令查找的位置。
[root@mq ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


##变量SHELL:当前用的shell是什么,可以修改配置文件修改当前shell
[root@mq ~]# echo $SHELL
/bin/bash
[root@mq ~]# usermod -s /bin/sh root
[root@mq ~]# echo $SHELL
/bin/sh


##变量UID:当前用户的uid。
[root@mq ~]# echo $UID
0
[root@mq ~]# id root
uid=0(root) gid=0(root) groups=0(root)


##HISTSIZE:命令历史的长度
[root@mq ~]# echo $HISTSIZE
1000


##HOME:当前用户的家目录
[root@mq ~]# echo $HOME
/root


##变量PWD:当前所在的位置
[root@mq etc]# echo $PWD
/etc


##变量HISTFILE:命令历史报存到那个文件去了
[root@mq etc]# echo $HISTFILE
/root/.bash_history


##变量PS1:定义命令提示符的样式
[root@mq etc]# echo $PS1
[\u@\h \W]\$
[root@mq etc]# PS1='\W'
etcPS1='[\u@\h \W]\$'
  • 只读变量:也就是常量,不能修改值,不能销毁,只能等shell进程终止时随之消亡。
[root@mq ~]#readonly uu=666
[root@mq ~]#echo $uu
666
[root@mq ~]#uu=777
bash: uu: readonly variable
[root@mq ~]#unset uu
bash: unset: uu: cannot unset: readonly variable

三、脚本基础知识

程序执行两类返回值:

  • 程序执行的结果。
  • 程序状态返回代码(0-255):
    • 0:正确执行。
    • 1-255:错误执行,1、2、127系统预留,有特殊意义。

注意事项:

  1. 禁止将未成功执行过的代码直接写入脚本。
  2. 脚本中的命令一定要写绝对路径。

3.1 脚本测试命令

  • 写脚本时,应该写一段就测试一下,测试成功再继续往下写,避免写完发现脚本执行失败。

1.bash -n 检查脚本语法是否错误。
在这里插入图片描述
2. bash -x单步执行,用于脚本排错。
在这里插入图片描述

3.2 shell运算符

运算符释义
let C= $ A+$Blet表示“让”,让C=A+B
C=$ [$ A+$ B]$ [算术运算表达式]
C=$ (($ A+$ B))$((算术运算表达式))
C= ` expr $A + $B `有反引号,表达式中各操作数及运算符之间要有空隔,而且要使用命令引用

1.例一, let C= $ A+$B 。

#加法。
[root@mq ~]# cat boat.sh  
#!/bin/bash
let a=$1+$2
echo $a
[root@mq ~]# bash boat.sh 1 2
3


#减法。
[root@mq ~]# cat boat.sh  
#!/bin/bash
let a=$1-$2
echo $a
[root@mq ~]# bash boat.sh 9 1
8


#乘法。
[root@mq ~]# cat boat.sh  
#!/bin/bash
let a=$1*$2
echo $a
[root@mq ~]# bash boat.sh 1 5
5


##除法,保留小数。
[root@mq ~]# cat boat.sh 
#!/bin/bash
echo 'scale=2;5/2' | bc      #scale保留几位小数,bc需要下载
[root@mq ~]# bash boat.sh 
2.50

2.例二,C=$ [$ A+$ B] ,可取加减乘除, +/-/*/(/)。

##加法。
[root@mq ~]# a=$[1+2] 
[root@mq ~]# echo $a
3

3.例三,C=$ (($ A+$ B)),可取加减乘除, +/-/*/(/)。

##加法。
[root@mq ~]# a=$((33+4)) 
[root@mq ~]# echo $a
37

4.例四,C=` expr $A + $B ` 。

[root@mq ~]# cat boat.sh 
#!/bin/bash
a=`expr $1 + $2`
echo $a
[root@mq ~]# ./boat.sh 2 3
5

3.3 命令逻辑关系

  1. 逻辑与:&& 两个条件必须都为真,输出才为真。
    • 第一个条件为假时,第二个条件不用再判断,最终结果已经有
    • 第一个条件为真时,第二个条件必须得判断
  2. 逻辑或:|| 两个条件有一个为真,输出才为真
    • 前一个命令的结果为真时,第二个命令就不执行。
    • 前一个命令的结果为假时,第二个命令必须执行

1.两个条件:1不等于2,2大于或等于2,两个条件都成立,返回0。
在这里插入图片描述

2.两个条件:1大于2,2大于3,两个条件都不成立,返回1。
在这里插入图片描述

3.4 bash条件判断

条件测试类型:

  • 整数测试
  • 字符测试
  • 文件测试

3.4.1 条件测试的表达式

1.例一,[ expression ]

[root@mq ~]# [ 1 -le 2 ]
[root@mq ~]# echo $?
0

2.例二,[[ expression ]]

[root@mq ~]# [[ 1 -le 2 ]]
[root@mq ~]# echo $?
0

3.例三,test expression

[root@mq ~]# test 1 -le 2
[root@mq ~]# echo $?
0

3.4.2 整数测试

运算符
-eq测试两个整数是否相等
-ne测试两个整数是否不等
-gt测试一个数是否大于另一个数
-lt测试一个数是否小于另一个数
-ge大于或等于
-le小于或等于

3.4.2 字符测试

运算符释义
==等值比较,检查==两边的内容是否一致,==两边都要有空格
!=检查两边内容是否不一致,不一致为真,一致为假
=~左侧字符串是否能够被右侧的PATTERN所匹配到。此表达式应用于双中括号[[]]中
-z “string”测试指定字符串是否为空,空则为真,不空则为假
-n “string”测试指定字符串是否不空,不空则为真,空则为假

1.例一。
在这里插入图片描述
2.例二,-z ‘string’
在这里插入图片描述

3.4.3 文件测试

标识符释义示例
-f测试文件是否为普通文件。[ -f anaconda-ks.cfg ]
-d测试指定路径是否为目录[ -d httpd/ ]
-s测试文件是否非空[ -s qingjun.txt ]
-e测试文件是否存在
-b测试文件是否为块设备文件
-c测试文件是否为字符设备文件
-h测试文件是否为符号链接文件
-L测试文件是否为符号链接文件
-p测试文件是否为命名管道文件
-S测试文件是否为套接字文件
-r文件权限类,测试当前用户对指定文件是否有读权限
-w文件权限类,测试当前用户对指定文件是否有写权限
-x文件权限类,测试当前用户对指定文件是否有执行权限
-g文件特殊权限,测试文件是否有sgid权限
-u文件特殊权限,测试文件是否有suid权限
-k文件特殊权限,测试文件是否有sticky权限
-t fdfd表示的文件描述符是否已经打开且与某终端相关
file1 -ef file2测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件
file1 -nt file2测试file1是否比file2新
file1 -ot file2测试file1是否比file2旧
-N测试文件自从上一次被读取之后是否被修改过
-O测试文件是否存在并且被当前用户拥有
-G测试文件是否存在并且默认组是否为当前用户组

3.4.4 组合测试条件

标识符释义
-a表示与,两个条件都要成立
-o表示或,只要一个条件成立即可
!非关系,取反

1.例一,测试-a与关系。

[root@mq ~]# [ 1 -eq 1 -a 2 -le 3 ]
[root@mq ~]# echo $?
0
[root@mq ~]# [ 1 -eq 1 -a 2 -gt 3 ]
[root@mq ~]# echo $?
1
[root@mq ~]# 

2.例二,测试 -o或关系。

[root@mq ~]# [ 1 -eq 1 -o 2 -gt 3 ]
[root@mq ~]# echo $?
0
[root@mq ~]# 

3.例三,测试 ! 取反。

[root@mq ~]# [ ! 1 -gt 1  ]
[root@mq ~]# echo $?
0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.数据结构期末复习之图以及相关算法

1.应用: 教学计划(先修什么才能修什么课程)社交网络地图导航 2.什么是图? 顶点(有穷非空个)顶点的边 ,抽象为G(V,E) (Vert,Edge) 1.无向图: 点到点都可以到达 表示为(vi,vj) 2.有向图 只能一个点到另外一个点 表示为<vi,vj> 又分为: 1.非带权图(上面的例子就是) 2.带权图…

Day29

TCP_SER #include <myhead.h>//定义处理错误的宏函数 #define ERR_MSG(msg) do{\fprintf(stderr,"line:%d %s %s",__LINE__, __FILE__, __func__);\perror(msg);\ }while(0)//定义IP和端口号 #define IP "192.168.2.186" #define PORT 6666int …

数组的定义方式及访问

问题 如何创建及访问数组。 方法 了解数组的概念 数组就是存储多个数据的容器&#xff0c;数组的长度固定&#xff0c;多个数据的数据类型要一致。 数组的三种定义方式 数据存储的数据类型[] 数组名字 new 数组存储的数据类型[长度] 数据类型[] 数组名 new 数据类型[]{元素…

测试人35岁何去何从?软件测试路在何方?“我“一路升级打怪...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试员干到35岁&a…

暑期健身房招生活动文案分享,在线传单设计

想要有效地宣传健身房的信息&#xff0c;还能够吸引学员了解报名的宣传单要怎么制作&#xff1f;不用自己动手设计&#xff0c;借助在线模板和在线设计工具&#xff0c;一键就能生成专属的招生传单。以下是在线招生传单设计教程和传单设计模板使用教程。 首先找到一个在线设计工…

Juypter更改默认路径,并且解决改完默认路径不自动跳转的问题

目录 更改默认路径 第一步先在你所安装的juypter的环境下输入下面代码 第二步在自己的文件夹下找到这个目录&#xff0c;用记事本打开 第三步更改快捷方式 解决浏览器不调转方法 相对于juypter来讲&#xff0c;还是挺好用的&#xff0c;自我感觉比pycharm更好一点。 juypt…

ES6中 Promise和使用场景

介绍 &#x1f959;&#x1f959;&#x1f959;更加合理和更加强大 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数&#xff09;更加合理和更加强大 在以往我们如果处理多层异步操作&#xff0c;我们往往…

群晖服务器被encrypted勒索病毒攻击后的表现与如何解密勒索病毒

群晖服务器是一种高效的数据管理方案&#xff0c;但是如果被Encrypted勒索病毒感染&#xff0c;可能会导致许多重要的数据会丢失。Encrypted勒索病毒将加密被感染服务器上的文件&#xff0c;导致它们无法打开。一旦我们遭到encrypted勒索病毒攻击&#xff0c;建议大家选择专业的…

【Web开发技术】异常处理机制的使用

文章目录 一、引言1、应用场景2、语法3、体系 二、详细设计&#xff08;后端开发&#xff09;1、信息提示常量类2、自定义异常3、Model层4、Controller层5、View层 一、引言 编程也有很久的时间了&#xff0c;如果每个报的错误和寻找的答案写成一张纸&#xff0c;叠加起来也得有…

JAVA项目代码几乎没有改动,重新发布后突然报错,无法启动

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; JAVA项目代码几乎没有改动&#xff0c;重新发布后突然报错&#xff0c;无法启动 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; JAVA项目代码几乎没有改动&#xff0c;重新发布后…

2023年PMP 续证的费用和流程最全介绍

PMP证书并不是终身有效的&#xff0c;是需要三年一续的&#xff0c;PMI会在有效期截止前给持证者发邮件提示换证&#xff08;续证&#xff09;。目前的续证费用为150美金和积满60个PDU&#xff0c;60个PDU是在证书三年有效期内积满就可以&#xff0c;像我的培训机构艾威每周都会…

当Mysql缓慢时,这几招可解燃眉之急

第一步定位问题源&#xff1a; 常见的以查询Mysql性能问题的方法 1.大部分的性能问题都是查询过慢的问题&#xff0c;可以查询慢sql日志。 通过慢查询日志定位那些执行效率较低的SQL语句&#xff0c;用–log-slow-queries[ file_name]选项启动时&#xff0c;mysqld写一个包含所…

售后退换货客服话术

在客服的工作生涯里&#xff0c;售后退换货这种问题&#xff0c;对于我们客服来说可以说是见惯不惯了。今天小编给大家准备了一些退换货的售后回复话术&#xff0c;让大家工作起来更加高效。 一、引导退换货 1.亲&#xff0c;麻烦您收到后请先试穿&#xff0c;请一定要保持衣服…

WordPress入门版,保姆级记录

服务器里用户越近&#xff0c;访问速度越快&#xff0c;所以需要根据用户群体选择合适的服务器 国外网站&#xff1a;SiteGround国内网站&#xff1a;阿里云 bidewang.co/sg WordPress托管服务器页面&#xff0c;一般选择第二个套餐 没有域名则选择购买域名 然后填选购买信息…

007-从零搭建微服务-网关中心(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 新建 mingyue-gateway 在 【从零搭建微服务…

练习SpringBoot烘培坊项目

烘培坊项目 文章目录 烘培坊项目项目概述项目搭建项目关键代码实现实现首页轮播图实现注册功能实现登录功能实现图片上传稿件管理页面内容列表功能稿件管理页面修改功能稿件管理页面删除功能首页三个类型下的分类展示首页三种类型的内容展示点击查看更多进入列表页面在header里…

mysql waf绕过-WAF Bypass技巧(2)

数据库waf绕过的一些玩法 WAF Bypass技巧(0)_luozhonghua2000的博客-CSDN博客 WAF绕过-WAF Bypass技巧(1)_luozhonghua2000的博客-CSDN博客 数据库特性 第一篇: Mysql数据库特性 0x01 前言 我们经常利用一些数据库特性来进行WAF绕过。在Mysgl中,比如可以这样 位置一: 参数和…

泰坦尼克号幸存者预测

本文所有的代码及数据均存放与https://github.com/MADMAX110/Titanic 泰坦尼克号幸存者预测挑战赛是一个非常受欢迎的机器学习实践项目。这是 Kaggle.com 上最受欢迎的比赛之一。 数据中有3个文件:train.csv&#xff0c;test.csv&#xff0c;和gender_submit .csv。 train.csv包…

内存碎片:理解、应用场景和防止措施

目录 摘要1. 引言2. 内存碎片的概念3. 内存碎片的产生原因4. 应用场景4.1 应用场景一&#xff1a;长时间运行的服务器4.2 应用场景二&#xff1a;嵌入式系统 5. 预防和处理内存碎片6. 示例代码&#xff1a;生成内存碎片7. 总结 摘要 本文旨在向初学者详细介绍内存碎片的概念、…

【爬虫】4.1 Scrapy 框架爬虫简介

目录 1. Scrapy 框架介绍 2. 建立 Scrapy 项目 3. 入口函数与入口地址 4. Python 的 yield 语句 5. Scrapy 爬虫的数据类型 1. Scrapy 框架介绍 1.1 Scrapy 的安装 pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple/ 1.2 Scrapy爬虫框架结构 “52”结构&…