shell脚本编程基础

shell脚本语言的基本结构

shell脚本的用途

  1. 自动化常用命令
  2. 执行系统管理和故障排除
  3. 创建简单的应用程序
  4. 处理文本或文件

shell脚本的基本结构

shell脚本编程:是基于过程式、解释执行的语言

编程语言的基本结构:

  • 各种系统命令的组合
  • 数据存储:变量、数组
  • 表达式:a+b
  • 控制语句:if

shell脚本:包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行shebang机制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

创建shell脚本过程

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell声明序列:#!

第二步:加执行权限

chmod +x hello.sh

第三步:运行脚本

./hello.sh

第一个脚本及运行

#!/bin/bashecho "hello world"

在脚本文件目录下执行

root@sjn:/home# ./hello.sh
hello world

在任意一个目录执行

root@sjn:/opt# /home/hello.sh 
hello world

通过bash来执行

root@sjn:/home# bash ./hello.sh
hello world

通过cat和bash来运行

root@sjn:/home# cat hello.sh | bash
hello world

通过curl下载远程服务器上脚本,在本机上运行

curl http://10.0.0.7/hello.sh | bash

通过wget执行

wget -qO - 10.0.0.7/hello.sh | bash

变量

变量类型

变量类型:

  • 内置变量,如:PS1,PATH,UID,HOSTNAME,BASH,HISTSIZE
  • 用户自定义变量

不同的变量存放的数据不同,决定了

  • 数据存储方式
  • 参与的运算
  • 表示的数据范围

变量的数据类型

  • 字符
  • 数值:整型、浮点型,bash不支持浮点数

Shell中变量命令法则

  • 不能使用程序中保留字:如:if,for
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线-
  • 顾名知义,用英文名字,并体现出实际作用
  • 统一命名规则:驼峰命名
  • 变量名大写
  • 局部变量小写
  • 函数名小写

变量定义和引用

变量的生效范围等标准划分变量类型

  • 普通变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
  • 环境变量:生效范围为当前shell进程及其子进程
  • 本地变量:生效范围为当前shell进程某代码片段,通常指函数

变量赋值:

name='value'

value可以是多种形式

直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)

注:变量赋值是临时生效,当退出shell时,变量会自动删除,无法持久保存。脚本中的变量会随着脚本的结束而被删除。

变量引用

$name
${name}

例子

root@sjn:/etc/nginx/conf.d# echo $NAME $AGE
sjn 20
root@sjn:/etc/nginx/conf.d# echo $NAME$AGE
sjn20
root@sjn:/etc/nginx/conf.d# echo $NAME_$AGE
20
root@sjn:/etc/nginx/conf.d# echo ${NAME}_$AGE
sjn_20

弱引用和强引用

  • “$NMAE” 弱引用,其中的变量引用会被替换为变量值
  • '$NAME’强引用,其中的变量引用不会被替换为变量值,而保持原字符串
root@sjn:/home# echo "I am $NAME"
I am root
root@sjn:/home# echo 'I am $NAME'
I am $NAME

显示已定义变量

set

删除变量

unset

范例1systeminfo.sh

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 eth0|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "OSVERSION:    $RED`cat /etc/issue`$END"
echo -e "KERNEL:       $RED`uname -r`$END"
echo -e "CPU:          $RED`lscpu | grep 'Model name' | 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"

范例2:利用变量实现动态命令

root@sjn:~# CMD=hostname
root@sjn:~# $CMD
sjn

环境变量

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

变量声明和赋值

#一步到位
export name=VALUE
declare -x name=VALUE#分成两步
name=VALUE
export name

变量引用:

$name
${name}

显示所有环境变量

env
printenv
export
declare -x

bash内建的环境变量

PATH
SHELL
USER
UID
HOME
PWD
SHLVL #shell的嵌套层数
LANG
MAIL
HOSTNAME
HISTSIZE

只读变量

只读变量:只能声明定义,后续不能修改和删除。

声明只读变量

readonly name
declare -r name

查看只读变量

readonly [-p]
declare -r

范例:

root@sjn:~# readonly PI=3.14159
root@sjn:~# echo $PI
3.14159
root@sjn:~# unset PI
-bash: unset: PI: cannot unset: readonly variable
root@sjn:~# echo $PI
3.14159

位置变量

位置变量:在bash shell中内置的变量,在脚本代码中通过命令行传递给脚本的参数。

$1,$2,...,对应第一,第二个等参数
$0, 命令本身,包括路径
$*, 传递给脚本的所有参数,全部参数合为一个字符串
$@, 传递给脚本的所有参数,全部参数为独立字符串
$#, 传递给脚本的参数的个数
注意,$@, $*只在被双引号包起来才会存在差异

清空所有位置变量

set --

范例1:arg.sh

echo "1st arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
echo "The number of arg is $#"
echo "All args are $*"
echo "All args are $@"
echo "The script of name is `basename $0`"
root@sjn:~# ./arg.sh 1 2 3
1st arg is 1
2st arg is 2
3st arg is 3
The number of arg is 3
All args are 1 2 3
All args are 1 2 3
The script of name is arg.sh

范例2

root@sjn:~# cat f1.sh
echo "f1.sh: args are $*"
echo "f1.sh: args are $@"./f2.sh "$*"
root@sjn:~# cat f2.sh
echo "f2.sh: args are $1"
root@sjn:~# ./f1.sh 1 2 3
f1.sh: args are 1 2 3
f1.sh: args are 1 2 3
f2.sh: args are 1 2 3

退出状态码变量

进程执行后,将使用变量$?保存状态码的相关数字,不同的值表示成功或失败,$?取值范围0-255

$?的值为0,代表成功
$?的值为1-255,代表失败

展开命令行

脚本安全和set

格式化输出printf

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

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

相关文章

如何控制mem/ip出pin在pin的正中间

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 无论是ICC2还是innovus都不提供这样的功能,如果有这样的要求就需要通过脚本实现,这里提供一个参考脚本。 proc cb {boundary width spacing exten} {set y [expr ([linde x $boundary 1 1] - [l…

vitepress项目使用github的action自动部署到github-pages中,理论上可以通用所有

使用github的action自动部署到github-pages中 创建部署的deploy.yml文件,在项目的根目录下面 .github\workflows\deploy.yml 完整的代码:使用的是pnpm进行依赖安装。 name: 部署VitePresson:push:branches:- docs # 这段是在推送到 docs 分支时触发该…

C# 使用NUnit进行单元测试

写在前面 NUnit是一个开源的.Net单元测试框架,经常被用来在.Net体系下做白盒测试。 NUnit.org GitHub 本文记录一个简单的使用NUnit进行单元测试的完整流程。 代码实现 新建一个目标类库NUnitTester,添加待测试的类文件,内容如下&#…

测试理论知识四:大型软件的测试技巧——单元测试

1. 模块测试/单元测试 模块测试也被称为单元测试,本文章称单元测试为主。 对于小的程序测试,我们可以在一定时间内完成,如果面对的是大型程序,等程序开发完成之后我们再进行测试,那会大大降低我们的效率。 单元测试…

OpenHarmony开发—Ubuntu环境搭建

搭建Ubuntu环境 在嵌入式开发中,很多开发者习惯于使用Windows进行代码的编辑,比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段,大部分的开发板源码还不支持在Windows环境下进行编译,如Hi3861、Hi3516…

docker学习(十、搭建redis集群,三主三从)

文章目录 一、docker创建6个redis容器创建6个redis容器回顾各个属性含义 二、划分主从,3主3从划分主从查看状态查看节点信息 基础理论在这里有详细描述: docker学习(九、分布式存储亿级数据知识) 后续redis集群操作: d…

watch监听的使用

watch是什么? 在 Vue 3 中,watch 函数被重新设计为一个独立的 API,用于观察数据变化并执行相应的操作。 watch 函数接受两个参数: 第一个参数可以是一个函数或数组。如果是函数,则返回要监听的数据,当数…

聪明高效能力广,AGI如何赋能内容管理?

文 | 智能相对论 作者 | 叶远风 毫无疑问,现在的大模型在技术比拼之外,如何通过产品化的方式走入到实际业务,是各厂商的着力点。 而一些一贯与数字化场景紧密融合的服务厂商,在大模型浪潮一开始就已经走在落地一线。 大数据基…

FreeRTOS 时间管理和定时器

FreeRTOS 是一个开源的实时操作系统,提供了丰富的时间管理和定时器功能,用于实现任务调度、延时等操作。在本文中,我们将深入探讨 FreeRTOS 的时间管理和定时器相关的内容。 时间管理 FreeRTOS 提供了以下几种与时间相关的管理功能&#xf…

【C++高阶(八)】单例模式特殊类的设计

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 单例模式 1. 前言2. 设计一个不能被拷贝/继承的…

SVN搭建指导

环境 centos 7.9 SVN安装方式一:yum 1.1 http服务 至今还没有搞定网页版,网页版需要搭建apache http服务。遇到如下问题: centos - svn: Could not open the requested SVN filesystem - Stack Overflow 在试了加777权限,加a…

c语言:指针作为参数传递

探究实参与形参它们相互独立 由于主调函数的变量a,b与被调函数的形参x,y它们相互独立。函数 swap 可以修改变量x,y,但是却无法影响到主调函数中的a,b。 现在利用取地址运算符,分别打印它们的首地址&#x…

生物识别规划人脸识别方案的概述

方案概述 人脸识别方案采用高性能AI芯片,支持RGB和IR摄像头, 支持LCD显示屏。方案特点 • 普通RGB摄像头和IR摄像头同时参与3D成像RGB摄像头 支持屏幕回显 • 双目摄像头得到特征点视差计算人脸相 对3D深度信息, 同时利用可见光和红外 光谱信…

Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

Axure RP 8,一款引领潮流的交互式原型设计工具,为设计师提供了无限的可能性,让他们能够创造出逼真的原型,从而更好地展示和测试他们的设计。 Axure RP 8拥有丰富的功能和工具,让设计师可以轻松地创建出复杂的交互式原…

SQLite数据库的增删改查

一、前言 这篇文章主要针对Android自带的轻量级数据库SQLite 实现增删改查。该数据库常用于本地数据的储存喝管理。例如,可以将用户信息,日志数据等重要信息存储在SQLite数据库中。 二、代码实现 1.创建MySqliteOpenHelp作为工具类 /*** MySqliteOpen…

GSCoolink GSV1201E Type C/DP1.2转HDM1.4

DisplayPort 1.2 to HDMI 1.4 Converter with Embedded MCU 功能特征 1、GSV1201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.2 to HDMI 1.4转换器。 2、显示接口接收器支持21.6Gbps(HBR2,4-lane)。 3、HDMI发射器支持9Gbps(TMDS3G3Lane)。…

Swagger2接口测试文档

目录 一、Swagger简介 1.1 Swagger是什么? 1.2 为什么要用Swagger 1.3 Swagger注解 二、Spring集成Swagger 三、测试环境配置 一、Swagger简介 1.1 Swagger是什么? Swagger是一款RESTFUL接口的文档在线自动生成功能测试功能软件。Swagger是一个规…

git如何修改提交代码时的名字和邮箱?

在Git中修改提交时使用的用户名和电子邮件地址,你可以通过配置全局或本地的Git配置文件来实现。全局配置适用于你系统上的所有Git仓库,而本地配置只适用于当前仓库。 修改全局用户名和邮箱 如果你想要更改全局的用户名和邮箱,你可以使用下面…

Linux之进程(五)(进程控制)

目录 一、进程创建 1、fork函数创建进程 2、fork函数的返回值 3、fork常规用法 4、fork调用失败的原因 二、进程终止 1、进程终止的方式 2、进程退出码 3、进程的退出方法 三、进程等待 1、进程等待的必要性 2、wait函数 3、waitpid函数 四、进程程序替换 1、概念…