首页 > 系统相关 >shell 语法介绍

shell 语法介绍

时间:2023-11-13 16:44:40浏览次数:36  
标签:语句 shell 变量 介绍 echo 语法 sh 数组

大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就能够看懂了,一些比较高级的语法可以遇到的时候再去学习。

我认为学习一门编程语言语法的时候,最基本的无外乎就是语言中的类型定义,以及循环或if else等跳转指令,懂了这两个以后,便能写一些简单的逻辑了。所以shell语言也不例外,我也会从这两个角度去介绍。

变量定义

首先看下shell中对变量的定义,其中分为环境变量和局部变量。

环境变量在子shell进程中是可见的,可以通过export 关键字进行定义,如下所示,

[root@localhost ~]# export VAR=value

局部变量是指在某个shell中生效的变量,这个变量在其他shell中是无效。

变量的定义

变量的定义可以通过如下方式进行定义,

变量名=变量值,

[root@localhost ~]# name=john 

注意点一:变量名和变量值之间用等号紧紧相连,之间没有任何空格
注意点二:当变量中有空格时必须用引号(单引号,双引号都可以)括起,否则会出现错误

变量的引用

定义了变量,那么如何对其进行引用呢?可以通过如下方式对变量进行引用,

在变量前面加上$ 符号即可。

(base) ➜  ~ name=lanpangzi
(base) ➜  ~ echo $name
lanpangzi

更标准点的写法是用${}将变量名括起来。

(base) ➜  ~ echo ${name}
lanpangzi

位置参数

除了通过${变量名} 方式引用变量,还可以通过 $数字 方式获取shell脚本的参数,$0 代表第一个参数,$1 代表第二个参数,依次类推。 另外 $# 代表参数的个数, $* 或者 $@代表所有参数,例如我写一个脚本 输出这些变量。

脚本如下,

!/bin/sh
echo "第一个参数: $0"
echo "第二个参数: $1"
echo "所有参数: $@"
echo "参数个数: $#"

运行这个脚本

(base) ➜  ~ sh print.sh wudi lanoangzi
print.sh: line 1: !/bin/sh: No such file or directory
第一个参数: print.sh
第二个参数: wudi
所有参数: wudi lanoangzi
参数个数: 2

注意下shell脚本中单引号和双引号的区别,如果要让输出的语句中引用变量,那么要用双引号。

数组的语法

另外,在shell脚本中还有个经常用到的类型,数组,与其他语言不同的是,shell脚本中的数据只支持一维数组。

数组的定义方式如下,

declare 关键字定义数组,其中元素用()括起来,并且元素之间用空格隔开。

declare arr1=(元素1 元素2)

数组中的元素引用方式如下,

echo ${数组名[索引号]}

比较特殊的是可以通过 ${数组名[@]} 或者 ${数组名[*]} 获取数组中的 元素, 可以通过 ${#数组名[@]} 或者 ${#数组名[*]} 获取数组的长度。

对数组中元素替换和新增数组元素可以按如下操作,

对指定位置的变量进行替换

数组名[索引值]=30

假设数组名是arr,对数组末尾进行元素添加,

arr[${#arr[@]}]=30

循环以及判断语句

看了变量的定义,我们再来看看shell脚本中的跳转指令,在学跳转指令前还需要对shell中如何对表达式获取表达式的结果有所了解,因为一般跳转指令都是条件跳转,像if else之类的语句,总有个判断条件。

表达式结果

在shell中可以通过$? 获取上一个shell语句的执行结果,shell命令中规定0才是命令正确执行后的返回结果,其余结果都是不正确的。

让表达式执行比较逻辑的方式有两种,

1, 第一种是通过test expression 的方式,test后面跟表达式,如下所示,比较了两个数字是否相等,返回1说明相等。

(base) ➜  ~ test 1 -eq 2
(base) ➜  ~ echo $?
1

2, 第二种方式是使用[] 把表达式括起来,这种方式注意[] 内变量需要与括号相隔一个空格才行。

(base) ➜  ~ [ 1 -eq 2 ]
(base) ➜  ~ echo $?
1

字符串比较

接着来看下shell中如何对字符串进行比较,

Pasted image 20231113150355.png

字符串的比较是可以用> < 这种符号的,数字则不同。

数字比较

Pasted image 20231113150429.png

文件相关的判断

除了数字和字符串的比较,我们平时还经常会用到对文件的判断,比如判断文件是否存在等,如下是对文件相关操作的判断。

Pasted image 20231113150747.png

if 语句

了解了判断语句就可以看看跳转指令的语法,首先我们看下if语句在shell中是如何写的。

if expression; then 
		command 
fi

通过if then fi三个关键字组成了最简单的if语句,其中expression则是前面讲到的判断语句的表达式,如下,执行这个脚本将会输出,123 和456两行数据。

!/bin/sh
num=1
if test $num -eq 1 ;then
        echo 123
fi
if [ $num -eq 1 ] ;then
        echo 456
fi

if else 语句也类似,它的语法结构如下,

if expression; then 
	command 
else 
	command 
fi

for while循环语句

for 语法结构

for VARIABLE in (list) 
do 
	command 
done

for语句可以遍历一个列表然后对其中每一个元素进行遍历。上述语法中,list既可以是变量也可以是固定数组表达式,也可以命令输出。

案例1,数组变量 循环

!/bin/sh
arr="1 2 3 4"
for num in ${arr}
do
   echo $num
done

案例2,固定数组表达式循环

!/bin/sh
for num in 1 2 3 4
do
   echo $num
done

案例3,命令输出结果 循环

!/bin/sh
for num in $(ls)
do
   echo $num
done

while 语法结构

while expression 
do 
	command 
done

表达式的语法也和之前if 语句那里讲的语法结构类似,这里就不再展开了。

总结

这一节简单的介绍了shell最基本的语法,掌握了这些,便可以简单的写一些最基本的脚本了。函数的声明和调用可以等用到的时候再学,后续也会介绍一些shell脚本的实际案例来巩固下这部分的内容。

标签:语句,shell,变量,介绍,echo,语法,sh,数组
From: https://www.cnblogs.com/hobbybear/p/17829489.html

相关文章

  • 编译原理-至下而上的语法分析
    目录至下而上分析的基本问题归约短语规范归约符号栈的使用算符优先分析优先关系算符文法及优先关表构造如何求FIRSTVT和LASTVT算符优先分析算法优先函数至下而上分析的基本问题归约用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,......
  • bat批处理常用系统信息、命令、语法、示例
    Windows下使用批处理设置东西,是很方便的事。一、获取系统信息1.获取CPU信息echo%PROCESSOR_ARCHITECTURE:~%系统CPU是AMD牌子,64位的1.1)获取CPU品牌echo%PROCESSOR_ARCHITECTURE:~0,3%1.2)获取CPU位数echo%PROCESSOR_ARCHITECTURE:~3%或echo%PROCESSOR_ARCHITEC......
  • Python requirements.txt安装用法介绍
    一、什么是requirements.txt文件在Python项目开发中,通常需要安装多个Python包。当我们在新的项目中启动一个虚拟环境,并且想要在新的虚拟环境中安装之前的依赖包时,就可以使用requirements.txt文件来完成。这个文件包含了所有需要安装的依赖包和其版本号。requirements.txt文件可以在......
  • java中String、StringBuffer和StringBuilder的区别(简单介绍)
    简单介绍java中用于处理字符串常用的有三个类:1、java.lang.String2、java.lang.StringBuffer3、java.lang.StrungBuilder三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用......
  • Kubernetes 各个组件介绍
    集群物理结构从角色角度K8s集群分为:master:所有请求的入口。node:所有应用的载体。部署方式:单Master节点:一个Master节点的K8s集群,不适用于生产环境。多Master节点:多个Master节点的K8s集群,具有高可用性。Pod创建时各个组件的功能当一个客户想要创建一个nginx的时候,各组件的请求流程。......
  • 通过PowerShellPlus示例脚本学习Powershell
    ##=====================================================================##Title:DisconnectVI-Server##Description:DisconnectsfromaVIserver##Author:Idera##Date:9/11/2008##Input:-VIserver:VirtualInfrastructu......
  • Spring5学习随笔-Spring5的基本介绍、工厂设计模式
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第一章、引言![](https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231113123010602-1325702857.png)SpringIOC工厂是Spring框架中的......
  • 正确的语法来在Node中查询MYSQL中的JSON_SET
    在Node.js中,我们可以使用mysql模块来查询MySQL数据库。但是,mysql模块并不直接支持JSON_SET函数,这是一个MySQL特有的函数,用于在JSON文档中插入或更新值。如果你需要在Node.js中使用JSON_SET,你可能需要使用mysql的预处理语句和JSON_EXTRACT函数来实现。以下是一个示例:varmysql=req......
  • 问题解答:SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试
    我的知识星球里有朋友咨询一个问题:我测试了一个S/4HANAcloud的purchaseorder的API,这个是ODATAV4格式的。在对CreationDate做filter后运行有报错Invalidparametertypeusedwithfunction'eq'.对datetime字段做filter,一直搞不清楚格式。请帮忙看一下。本文就安排这......
  • ABAP None-Class-Based 异常处理的一些局限性介绍试读版
    本教程前一篇文章,我们已经学习了ABAP里Non-Class-Based异常的使用方法:113.ABAP异常处理(ExceptionHandling)-什么是Non-Class-Based异常从历史上来说,SAPABAP先有Non-Class-Based异常,再有Class-Based异常的解决方案。从道理上分析,前者必定有一些使用上的缺陷,......