ShellScript脚本编程(一)

2024-05-03 22:52
文章标签 编程 脚本 shellscript

本文主要是介绍ShellScript脚本编程(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

image-20230620210335278

为什么要学习和使用shell?

Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学(运维人员)

Shell的分类

在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bash/shell( 重 点\默认 ),流行的还有/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/bin/tcsh/bin/csh

查看流行shell

cat /etc/shells 

当前系统使用的Shell

echo $SHELL

Shell脚本入门

文件命名规范

文件名.sh .sh是linux下bash shell 的默认后缀

Shell解析器

指定告知系统当前这个脚本要使用的shell解释器

#!/bin/bash

创建Shell文件

touch hello.sh

编辑Shell文件

#!/bin/bash
echo "Hello World"

执行脚本

bash ./hello.sh
sh ./hello.sh

更简单的执行方式,因为我们知道当前就在bash下面,所以可以直接执行文件

./hello.sh

此时你会发现,报错:-bash: ./hello.sh: Permission denied,这是因为没有权限,我们来查看权限

ll hello.sh # -rw-r--r--. 1 root root 31 Jun 21 05:41 hello.sh

接下来我们给他权限

chmod +x hello.sh

此时你会发现,文件变了颜色,所有可执行文件都会变颜色,变成绿色,执行文件

./hello.sh

扩展执行方案:

  1. source 文件.sh
  2. . 文件.sh

Shell变量_系统预定义变量

运行Shell文件的区别

第一种:bash ./hello.sh 和 sh ./hello.sh

第二种:source hello.sh 和 . hello.sh

两种运行的方式差异性在于,第一种是在子bash环境下运行,而第二种是在当前bash环境下运行,我们通过运行type source可以看到 source is a shell builtin (source 是 shell 内嵌)

我们执行ps -f可以查看当前bash环境,创建一个子bash,继续通过ps -f查看,在当前子bash环境下,你依然可以运行shell文件

从结果上来看,两者好像没有什么区别,但是如果引入更多知识,例如变量:如果子shell中设置的当前变量,父shell是可不见的

变量简介

变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如:age = 20

image-20230621140321383

全局变量和局部变量的区别

image-20230621140656767

全局变量:层层嵌套的子bash依然可以访问

局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢

常用系统变量

$HOME 、$PWD 、$SHELL 、$USER

查看当前所有的全局系统变量env

查看当前所有的变量set(包含全局和局部的,系统的,用户的)

Shell变量_用户自定义变量 

基本语法

定义变量:变量名=变量值

规则
  1. 等号前后不能有空格
  2. 在声明变量的时候是不需要添加$符号,但是使用时候需要添加
  3. 如果定义的是一个字符串,需要将值添加双引号或者单引号

温馨提示

查看定义的变量是全局还是局部

全局:env | grep 变量名

局部:set | grep 变量名

当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量

全局变量

如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export导出为一个全局变量

export 变量名

温馨提示

再子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加export也依然不会影响到父bash环境

Shell脚本中使用变量

我们可以在hello.sh的脚本中去调用全局和局部变量

#!/bin/bash
echo $txt

温馨提示

在shell脚本中使用变量,同样遵循全局和局部变量的规则

Shell变量_只读变量和撤销变量

自定义变量注意事项:

  1. 变量命名规范:字母、数字和下划线组成,其中数字不能开头
  2. 自定义变量一般都是小写的
  3. 在shell中,变量是没有类型的,或者我们理解为全部都是字符串类型
  4. 如果变量的值需要做数值运算,可以使用$((1+1))或者$[1+1]的形式

只读变量

在shell中,只读变量相当于是常量,定义之后不允许修改。定义规则

readonly 变量名=值

撤销变量

变量定义之后是可以撤销的,使用unset 变量名就可以撤销了

温馨提示

变量是可以撤销的,但是只读变量是不可以撤销的

Shell变量_特殊变量

在Shell中,存在一些特殊变量,他们具有特殊的意义

$n

$n代表接受参数,n是数字,代表在执行脚本时候传递的参数数量,例如$1-$9代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如${10}。比较特殊的是$0,代表当前脚本名称

#!/bin/bash
echo '======$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $0

$#

$#获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性

#!/bin/bash
echo '=====$#====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $#

$*$@

$*$@非常相似,都代表命令行所有的参数,但是$*把参数看成是一个整体,例如123 456。而$@把每个参数区分对待,例如[123,456] 注意:在没有循环遍历时候,两者效果一致

#!/bin/bash
echo '=====$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo '=====$*====='
echo $*
echo '=====$@====='
echo $@

$?

$?最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,有命令自己决定),则证明上面命令不正确了

[root@localhost scripts]# vim hello.sh
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# hello.sh
-bash: hello.sh: command not found
[root@localhost scripts]# echo $?
127
[root@localhost scripts]# 

Shell_运算符

我们将Shell当成一门编程语言来学习,那么就一定需要有运算符

在Shell中,还存在expr表达式,可以用于做运算

在Shell中,运算需要使用$((a+b))或者$[a+b]的形式

表达式 expr

expr 10 + 10
expr 10 - 10
expr 10 \* 10

温馨提示

运算符前后要添加空格

如何要赋值给一个变量,需要命令替换

a=$(expr 10 + 10)
a=`expr 10 + 10`

$((a+b))或者$[a+b]

$((10+10))
$[10+10]

实例操作

计算 (5+4) * 10 的值

s=$[(5+5)*10]

脚本中操作

创建add.sh,在执行的时候,通过传递参数的形式实现加法效果

#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum

这篇关于ShellScript脚本编程(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957825

相关文章

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的