【Linux后端服务器开发】shell脚本

news2024/11/25 18:32:33

目录

一、变量

1. 普通变量

2. 环境变量

3. 位置变量

4. 特殊变量

二、输入输出

1. read命令接收输入

2. echo命令输出字符串

三、表达式

1. 算术表达式

2. 逻辑表达式

四、分支控制

1. if 分支

2. case 分支

五、循环控制

1. for 循环

2. while 循环

3. until 循环

4. select 循环

六、函数

1. 函数的格式

2. 函数的返回值

3. 函数参数

4. 库函数


一、变量

shell脚本只有一种数据类型,就是string字符串类型。

变量名必须是字母开头,可以包含数字、下划线等,不能有空格,不能使用关键字。

1. 普通变量

变量取值,可以与其他字符串构成新的字符串

变量赋值,用“=”赋值两端无空格

2. 环境变量

环境变量的级别:

  • 系统级:System env-var
  • 用户级:User login env-var
  • 脚本级:Script env-var

查看系统的环境变量:

  • echo:显示某个环境变量,如 echo $PATH

  • export:设置一个新环境变量,export PATH=&PATH:/...要添加的路径.../

  • env:显示所有环境变量

  • unset:清除环境变量

  • set:显示本地定义的shell变量和环境变量

查看环境变量

#include <stdio.h>

int main(int argc, char* argv[], char* env[]) {
    for (int i = 0; env[i]; ++i) {
        printf("env[%d]: %s\n", i, env[i]);
    }
}

通过环境变量区分root用户和普通用户

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() {
    char* who = getenv("USER");
    if (strcmp(who, "root") == 0) {
        printf("user: %s\n", who);
    }
    else {
        printf("user: %s, 权限不够\n", who);
    }
}

自定义环境变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MY_ENV "myenv"
 
int main() {
    char* myenv = getenv(MY_ENV);
    if (myenv == NULL) {
        printf("%s, not found\n", MY_ENV);
    }
    else {
        printf("%s = %s\n", MY_ENV, myenv);
    }
    return 0;
}

3. 位置变量

#!/bin/bash

echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9

 打印命令行指令参数选项

        命令行指令通过不同的参数执行不同的任务

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
int main(int argc, char* argv[], char* env[]) {
    if (argc != 2) {
        printf("usage: \n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n", argv[0]);
        return 1;
    }
    if (strcmp("-a", argv[1]) == 0) {
        printf("功能%s\n", argv[1]);
    }
    else if (strcmp("-b", argv[1]) == 0) {
        printf("功能%s\n", argv[1]);
    }
    else if (strcmp("-ab", argv[1]) == 0) {
        printf("功能%s\n", argv[1]);
    }
    else if (strcmp("-abc", argv[1]) == 0) {
        printf("功能%s\n", argv[1]);
    }
    //...
}

4. 特殊变量

  • 最后一条命令状态:$?  (0成功,1失败,2错误)
  • 传递给script的参数的个数:$#
  • 将命令行所有的参数作为一个整体的字符串:$*
  • 查看进程的PID:$$
#!/bin/bash

echo $#
echo $*

 

二、输入输出

1. read命令接收输入

  • 接收标准输入(键盘)的输入
  • 接收其他文件的输入
  • 得到输入后,将输入放入一个变量中
  • read命令可以结合echo命令进行输入提示,也可用 -p 选项做输入提示
  • read命令会一直阻塞等待用户输入,可以通过 -t 选项设置等待秒速
  • read命令可以通过 -n 选项限制输入的字符数
  • read命令可以通过 -s 选项进行静默输入,不显示输入内容,如密码的输入

2. echo命令输出字符串

echo命令加上 -n 选项,输出不换号

 

echo命令加上 -e 选项,支持转义字符

  • \b:向前回退一个
  • \c:在字符串输入末尾不换号
  • \n:回车换行
  • \r:回车
  • \v:换行
  • \t:水平方向跳Tab制表符距离

 

echo的引用与转义

  • " ":可取值输出
  • ' ':将单引号内的值原样输出
  • ` `:将反撇号的内容当作命令取执行
  • \:转义字符

三、表达式

1. 算术表达式

expr命令:+    -    *    /    %         (乘法运算符必须加上"",其他运算符可加可不加)

 

let命令:可赋值和计算

 

算术扩展格式:双小括号

bc工具:yum install -y bc

 

2. 逻辑表达式

通过 test命令 进行逻辑判断:

  • 执行状态为0表示true,执行状态为1表示false,如果变量可能为空,需要加双引号
  • -n 选项:变量非空则命令成功
  • -z 选项:变量为空则命令成功
  • -eq 是按照数值比较,= 是按照字符进行比较

复合条件判断:

  • -gt ,greater than ,大于
  • -lt ,less than,小于
  • -ge,greter or equal,大于等于
  • -le,less or equal,小于等于
  • -eq,数值等于
  • -a ,and,与运算,可以用 && 替换
  • -o,or,或运算,可以用 || 替换

test命令可用 [  ] 中括号等价替换,注意 "[ " 和 " ]",前后中括号之间都要有空格

文件或目录属性判断:

  • -e:判断文件或目录是否存在
  • -d:判断是否为目录以及是否存在
  • -f:判断是否为文件以及是否存在
  • -r-w-x:判断权限

四、分支控制

1. if 分支

if 分支的结构

# 格式1:if 条件; then 执行; fi

#! /bin/bash
a=5
if [ $a -gt 3 ]
then
   echo "OK"
fi


# 格式2:if 条件1; then 执行1; else 执行2; fi

#! /bin/bash
a=1
if [ $a -gt 3 ]; then
   echo "OK"
else
   echo "error"
fi


# 格式3:if 条件1; then 执行1; elif 条件2; then 执行2; else 执行3; fi

#! /bin/bash
a=5
if [ $a -gt 8 ]; then
   echo ">8"
elif [ $a -gt 3 ]; then
   echo ">3"
else
   echo "<3"
fi

2. case 分支

case 变量值 in
模式 1)
	命令序列1;;
模式 2)
	命令序列2;;
	.......
*)
	默认命令序列;;
esac

case值得注意的特点

  • case行尾必须为单词"in",每一模式必须以右括号“)”结束
  • 双分号";;"表示命令序列结束
  • 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以用管道符号" | “表示或,如"A|B”.
  • 最后的 " *) " 表示默认模式,其中的 星号 相当于通配符
#!/bin/bash

read read -p "请输入一个字符,并按Enter键确定:" KEY
case "$KEY" in
    [a-z]|[A-Z]) echo "您输入的是字母!";;
    [0-9]) echo "您输入的是数字!";;
    *)	echo "您输入的是空格,功能键或其他控制字符。";;
esac

五、循环控制

1. for 循环

for val in valuelist...
do
    commands
done

for((exp1;exp2;exp3))
do
    commands
done

# exp1 初始化
# exp2 变量取值范围
# exp3 变量增量

 

2. while 循环

while command
do
    command
    ...
done

# while后面的命令执行成功则循环,否则跳出循环

while 简单循环

通过while脚本实现给文件内容加行号

3. until 循环

until command
do
    commands
done

# until后面的命令成功的时候结束循环,失败的时候进入循环

通过until脚本监控某用户是否登录

#!/bin/bash

until who | grep "$1" >/dev/null 2>&1
do
    sleep 3
done
echo "Be careaful, $1 is online now!"

# 2>&1 是把标准错误输出重定向
# /dev/null 是系统垃圾堆,将所有接收到的数据都丢失

# 若该用户未登录则命令指令不成功,即循环等待
# 当用户登录,until突出循环

 

4. select 循环

select var in menu...
do
    commands
done

# select 后面跟的是菜单
# in 关键字后面是菜单取值列表
# 这些值以空格隔开
# 用户选择数字对应菜单值
# 变量var获取值后执行循环一次
#!/bin/bash

PS3="Please Select[1-4]:"
select m in new insert modify delete exit;
do
    if [ $m = exit ]; then
        break
    fi
    echo $m;
done

# PS3是一个环境变量,它是selet的提示符

六、函数

1. 函数的格式

#shell中的函数定义
#其中function为关键字,FUNCTION_NAME为函数名
function FUNCTION_NAME(){
       command1 #函数体中可以有多个语句,不允许有空语句
       command2
       ...
}
#省略关键字function,效果一致
FUNCTION_NAME(){
       command1
       command2
       ...
}

# 函数名后的小括号中没有参数
# 函数function关键字可以不写
# 函数必须遵循先定义再定义原则

2. 函数的返回值

#!/bin/bash

echo -n "请输入文件名:"
read FILE
function checkFileExist(){
        if [ -f $FILE ]; then
                return 0
        else
                return 1
        fi
}

echo "call function checkFileExist"
checkFileExist
if [ $? -eq 0 ]; then
        echo "$FILE exist"
else
        echo "$FILE not exist"
fi

3. 函数参数

#!/bin/bash

function checkFileExist(){
		if [ -f $1 ]; then
				return 0
		else
				return 1
		fi
}

echo "Call function countLine"
checkFileExist $1       # 函数调用
if [ $? -eq 0 ]; then
		echo "$1 exist"
else
		echo "$1 not exist"
fi

#执行脚本时,通过直接向脚本传递文件全路径的方式传递参数
#可以看到这种方式不会因为测试文件的不一样而修改脚本本身的内容,非常简单

4. 库函数

由于Shell是一门面向过程的脚本型语言,而且用户主要是Linux系统管理人员,所以并没有非常活跃的社区,这也造成了Shell缺乏第三方函数库,所以在很多时候需要系统管理人员根据实际工作的需要自行开发函数库。下面建立一个叫 funclib 的函数库,该函数库目前只有一个函数,用于判断文件是否存在。

_checkFileExists(){
      if [ -f $1 ]; then
             echo "File:$1 exists"
      else
             echo "File:$1 not exist"
      fi
}

​其他脚本在希望直接调用_checkFileExists函数时,可以通过直接加载 funclib 函数库的方式实现。加载方式有如下两种:

#使用“点”命令
$ . /PATH/TO/LIB
#使用source命令
$ source /PATH/TO/LIB

假设现在有个脚本想要直接调用_checkFileExists函数,可以通过加载 funclib 函数库来实现。

 

可以通过 set 和 unset 命令查看当期那内存中已经定义和载入的函数,使用 unset 清除函数,函数修改后必须重新载入。

 

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

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

相关文章

redis键值对映射关系存储-Dict

基本概述 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别是&#xff1a;哈希表&#xff08;DictHashTable&#xff09;、哈希节点&a…

基于51单片机设计的电动车控制器

一、项目介绍 随着社会经济的快速发展,人们对节能环保的要求越来越高,电动车因其无污染、噪音小、使用成本低等优点逐渐成为了市场关注的焦点。同时,随着科技的不断进步和应用,电动车的技术水平也在不断提高。 为了更好地满足市场需求和科技进步的要求,本项目基于51单片…

车载以太网 - 数据链路层 - VLAN

数据链路层通信 以太网二层数据链路层的寻址方式、帧结构、及 VLAN (Virtual LocalArea Network)&#xff0c;其分为LLC(Logical Link Control)逻辑链路控制子层&#xff0c;和 MAC(Media Access Control)媒体访问控制子层&#xff0c;其中&#xff0c;MAC 子层负责以太网的总…

chatgpt赋能python:Python中的异常处理

Python中的异常处理 在Python编程中&#xff0c;异常是指程序出现了不正常的情况&#xff0c;比如语法错误、运行时错误等等。这些异常会导致程序崩溃&#xff0c;所以我们需要在程序中使用异常处理来避免这种情况的发生。 什么是异常处理&#xff1f; 异常处理是一种技术&a…

chatgpt赋能python:Python如何把多行合并成一行

Python如何把多行合并成一行 如果你常常需要处理文本数据&#xff0c;你就会遇到将多行文本合并成一行的需求。在Python中&#xff0c;这个任务非常简单&#xff0c;本文将介绍如何使用Python实现把多行合并成一行。 什么是多行文本&#xff1f; 在编程和文本处理中&#xf…

【MySQL高级篇笔记-其他数据库日志(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、MySQL支持的日志 1、日志类型 2、日志的弊端 二、慢查询日志(slow query log) 三、通用查询日志(general query log) 1、问题场景 2、查看当前状态 3、启动日志 方式 1 &#xff1a;永久性方式 方式2&#xff1a;临时性…

回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于LSTM-Ad…

chatgpt赋能python:Python如何将多个图像合并输出?

Python如何将多个图像合并输出&#xff1f; 如果您需要将多个图像合并为一个&#xff0c;并将其输出到一个文件中&#xff0c;则Python提供了一些简单的解决方案。在本文中&#xff0c;我们将介绍如何使用Python进行该操作&#xff0c;并附上示例和用法说明。 PIL库 Python …

计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

目录 11.1 二次贝塞尔曲线(三点)11.2 三次贝塞尔曲线(四点)11.3 二次贝塞尔曲面(3x3控制点)11.4 三次贝塞尔曲面(4x4控制点)补充说明 在20世纪50年代和60年代在雷诺公司工作期间&#xff0c;皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;开发了用于设计汽车车身的软件系统…

【信息与内容安全复习】第二章知识要点总结

1.网络媒体信息的获取流程 2.三原色原理 3.颜色特征表达的特点、问题和主要方法 4.文本特征表达的方式 5.网络媒体信息与网络通讯信息 6.网络媒体信息获取方法 7.补充 8.视觉特征表达的应用 9.颜色特征表达举例之颜色直方图 10.纹理特征和局部特征 答&#xff1a; 1.网络媒体…

Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解

文章目录 0.前言1. 字典的结构2. 源码解析2.1. 字典的结构体2.2. 字典的函数接口dictAdddictFinddictResize 3. 字典/哈希表的优缺点3.1 优点3.1.1. 快速的查找时间3.1.2. 动态调整大小3.1.3. 灵活的数据类型3.2 缺点 4.总结5. Redis从入门到精通系列文章 0.前言 上个篇章回顾…

java三大特性之【多态】

多态 1.1 概念1.2 实现条件1.3 方法重写&#xff08;override&#xff09;与方法重载&#xff08;overload&#xff09;1.4 向上转型1.5 向下转型 1.1 概念 同样的一个方法/行为&#xff0c;经过不同的对象&#xff0c;表现出不同的行为&#xff0c;这样的现象就称为多态。 举…

今天就详细告诉你发票识别软件能识别哪些内容

既然大家点进这篇文章&#xff0c;说明大家对增值税发票识别技术非常感兴趣。本文会先介绍增值税发票识别技术的相关知识&#xff0c;然后再具体介绍识别增值税发票的软件有哪些。 增值税发票识别技术是一种基于图像识别和深度学习算法的自动化技术&#xff0c;它可以快速准确…

AI问答:前端需要掌握的设计模式/vue项目使用了哪些设计模式/vue项目开发可以使用哪些设计模式

一、理解什么是设计模式 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。 设计模式是一个在软件设计领域中被广泛应用的概念&#xff0c;它指的是一套被公认为有效的解决特定问题的设计思路和方法。 设计模式更多的是指导思想和方法论&#xff0c;而不是现…

零基础学 MySQL(基础版)

零基础学 MySQL(基础版) 1. 引出 思考一个问题&#xff1a; 淘宝网&#xff0c;京东、微信&#xff0c;抖音 都有各自的功能,那么当我们退出系统的时候&#xff0c;下次再访问时&#xff0c;为什么信息还存在? 2. 解决之道 2.1 解决之道—文件、数据库 为了解决上述问题&…

chatgpt赋能python:Introduction

Introduction 在机器学习中&#xff0c;模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数&#xff0c;以便能够准确地预测未来的值。Python是一种功能强大的编程语言&#xff0c;提供许多库和框架来训练机器学习模型。在本文中&#xff0c;我们将探讨如何…

FFmpeg编程入门

标题 播放器框架常用音视频术语解复用器和编解码器FFmpeg库简介FFmpeg有8个常用库&#xff1a; FFmpeg函数简介封装格式相关编解码器相关 FFmpeg数据结构简介关系数据结构分析 播放器框架 流程&#xff1a;媒体文件通过复用器将音频流&#xff0c;视频流&#xff0c;字幕流分离…

iCache dCache

前言 CPU 和 RAM 之间存在多级高速缓存&#xff0c;一般分为 3 级&#xff0c;分别是 L1、L2、L3。 另外&#xff0c;我们的代码都是由两部分组成的&#xff1a;指令、数据。 L1 Cache 比较特殊&#xff0c;每个 CPU 会有两个 L1 Cache&#xff0c;分别为 iCache&#xff08;指…

互联网 Java 工程师高级面试八股文汇总(1260 道题目附解析)

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

苹果将在 iOS 17 引入新功能,Safari隐私浏览有重大更新

苹果公司正在对Safari隐私浏览系统进行重大更新&#xff0c;为用户在浏览网页时提供更好的保护&#xff0c;防止第三方跟踪器。 iPhone制造商说&#xff1a;先进的跟踪和指纹保护有助于防止网站使用最新的技术来跟踪或识别用户的设备。隐私浏览现在可以在不使用时锁定&#xf…