大家好,我是蓝胖子,在日常开发中或多或少都会接触到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中如何对字符串进行比较,

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

数字比较

文件相关的判断

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

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 语法介绍的更多相关文章

  1. shell 基本语法介绍

    一.介绍 shell 是属于弱类型语言,指的是在定义变量时不需要指定变量的类型,就如python也是弱类型语言.一般以: :.sh结尾的文件 :文件第一行固定为:#!/bin/bash,表示指定以sh ...

  2. shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    7月11日任务 20.1 shell脚本介绍20.2 shell脚本结构和执行20.3 date命令用法20.4 shell脚本中的变量 20.1 shell脚本介绍 1.shell脚本语言是linu ...

  3. Linux centosVMware shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    一. shell脚本介绍 shell是一种脚本语言 aming_linux blog.lishiming.net 可以使用逻辑判断.循环等语法 可以自定义函数 shell是系统命令的集合 shell脚 ...

  4. Shell语法规范

    ver:1.0 博客:https://www.cnblogs.com/Rohn 本文介绍了Shell编程的一些语法规范,主要参考依据为谷歌的Shell语法风格. 目录 背景 使用哪一种Shell 什么 ...

  5. shell语法习题练习进阶版

    第4章 shell语法深度习题练习 4.1 使用if,case,函数的方法将服务改成system(centos6) 4.1.1 if方法 4.1.1.1 system实现 4.1.1.1.1 编写代码 ...

  6. Swift翻译之-Swift语法入门 Swift语法介绍

    目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...

  7. makefile中的shell语法

    在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...

  8. flex弹性布局语法介绍及使用

    一.语法介绍 Flex布局(弹性布局) ,一种新的布局解决方案 可简单.快速的实现网页布局 目前市面浏览器已全部支持1.指定容器为flex布局 display: flex; Webkit内核的浏览器, ...

  9. shell重定向介绍及使用

    我们在写脚本或用脚本时,往往会发现 > /dev/null 2>&1 这类的命令.之前都是简单的了解一下,并没有深度消化,直到自己写脚本时,不认真写成了2>&1 &g ...

  10. freemarker语法介绍及其入门教程实例

    # freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>####  1.文本,直接输 ...

随机推荐

  1. shell: xscp

    #!/bin/bash ips=( 1.1.1.1 1.1.1.2 ) user= passwd= for i in ${ips[@]} do echo "== $i ==" ss ...

  2. ch-manager.sh

    [root@dev-clickhouse1 ~]# cat ch-manager.sh #!/bin/bash ch_arr=(ch1-shard1-main ch1-shard2-sub ch2-s ...

  3. 蜂鸟E203 仿真之路

    本文记录自己在学习蜂鸟E203的过程.下面简单介绍一下仿真之路所遇到的困难和走过的坑. 1.环境开发 :一般选择ubuntu 18.04 这个版本,安装这个教程很多,可以自行学习. 2.在Linux中 ...

  4. mysql系列03---事务

    一.事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销 操作请求,即这些操作要么同时成功,要么同时失败. 二.事物的四大特性 一个事务具有A ...

  5. rpm安装21c单实例数据库

    linux 7.6 使用rpm安装21c单实例数据库 一.基础环境配置 1.1 关闭防火墙 systemctl stop firewalld systemctl disable firewalld s ...

  6. Flask工厂模式蓝图使用Celery实例【亲测可用,已应用于项目中】

    单一模式运行Celery在官方文档中已经贴出范例代码,这里我们不过多介绍. 在使用Flaks编写大型项目时,使用工厂模式的好处显而易见.因在Celery4.x以上版本已经抛弃了init_app方法,所 ...

  7. 解决 Blazor 中因标签换行导致的行内元素空隙问题

    实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做"适配",在 Blazor 上也不例外.在做 Ant Design Blazor 时就深 ...

  8. 通过python,将excel中的数据写入二维列表

    需求:读取Excel表中数据,每行数据放在一个列表中,再把所有列表都存入到一个列表中,形成二维列表. 实现方法:导入可在Python处理Excel表格数据的模块. excel表: 方法一:xlwing ...

  9. 《Kali渗透基础》09. 漏洞利用、后渗透

    @ 目录 1:漏洞基本介绍 1.1:漏洞从哪里来 1.2:缓冲区溢出 1.3:如何发现漏洞 2:漏洞利用 2.1:EXP 选择与修改 2.2:避免有害的 EXP 3:后渗透阶段 3.1:Linux 上 ...

  10. 如何通过API接口获取1688的商品详情

    1688是中国最大的B2B电商平台之一,吸引了大量的国内外买家和卖家,提供了丰富的商品资源.许多开发者和企业想要通过API接口获取1688商品的详细信息,以便于进行商品数据分析.价格监控等工作.在本文 ...