Shell编程详解

文章目录

  • 一、Linux系统结构
  • 二、Shell介绍
    • 1、Shell简介
    • 2、Shell种类
    • 3、Shell查询和切换
  • 三、Shell基础语法
    • 1、注释
    • 2、本地变量
    • 3、环境变量
      • 3.1、查看环境变量
      • 3.2、临时设置环境变量
      • 3.3、永久设置环境变量
    • 4、特殊变量
    • 5、控制语句
      • 5.1、shell中的中括号
      • 5.2、if语句
      • 5.3、for循环
      • 5.4、while循环
      • 5.5、until循环
      • 5.6、break和continue语句
    • 6、函数
      • 6.1、函数的定义和调用
      • 6.2、带参数的函数
      • 6.3、将函数定义在 Shell 配置文件中
    • 7、重启springboot项目脚本
  • 四、Shell的执行方式
    • 1、使用指定Shell解释器
    • 2、使用chmod赋执行权限后运行
    • 3、使用当前Shell解释器
    • 4、将脚本放入系统PATH

一、Linux系统结构

  Linux操作系统是一种开放源代码的类UNIX操作系统,它的结构分为内核Shell应用程序三个层次。

  1. 内核层
    • 内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务
    • Linux内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,这使得内核可以兼容各种不同的硬件设备和外围设备
  2. Shell层
    • Shell是Linux系统的命令行解释器,它负责将用户输入的命令解释并执行
    • Linux系统上有多种Shell,其中最常用的是Bash Shell
    • Bash Shell 提供了各种丰富的功能和处理能力,如通配符、重定向、管道、变量等等
  3. 应用层
    • 应用层是Linux系统上的各种应用程序和服务,包括文本编辑器、图形界面、Web服务器、邮件服务器、数据库服务器等
    • 在Linux系统中,应用程序通常以开放源代码方式呈现,用户可以自由学习和使用,也可以根据需求自己编写、修改或扩展

在这里插入图片描述

二、Shell介绍

1、Shell简介

  • Shell被翻译为“壳”。在Linux内核外面包了一个壳
  • Shell是一种用于与操作系统进行交互的命令行解释器
  • 它是一种脚本语言,可以通过编写一系列的命令和脚本来执行操作系统的功能和任务
  • 我们在终端中编写的命令都是Shell命令。例如:ls、grep…等

2、Shell种类

  1. Bourne Shell(/bin/sh):是Unix系统最早的shell程序,由史蒂夫·伯恩斯(Steve Bourne)编写。该shell程序是许多Linux发行版中默认使用的程序
  2. Bourne-Again SHell(/bin/bash):是GNU项目的一部分,是Bourne Shell的增强版,目前在大部分Linux发行版中是默认的shell程序
  3. C Shell (/bin/csh):是Bill Joy编写的一个具有面向对象设计理念的shell程序,它采用与C语言相似的语法和控制结构。C Shell中的命令提示符为%号
  4. TENEX C Shell(/bin/tcsh):是C Shell的增强版,它对历史命令和别名等方面进行了改进,同时也支持C Shell中的所有特性。TENEX C Shell中的命令提示符也为%号
  5. Korn Shell(/bin/ksh):是由David Korn编写的shell程序,它是Bourne Shell和C Shell的结合,拥有两种不同的工作模式:交互模式和批处理模式
  6. Z Shell(/bin/zsh):是一个功能强大的shell程序,它是Bourne Shell的增强版,具有缩写、自动完成、句法高亮等功能,同时也支持Korn Shell、C Shell以及Bourne Shell的语法和命令

  每种Shell都有其特定的语法和功能,但它们通常都具有共同的基本功能,如变量操作、条件语句、循环语句和命令执行等。

3、Shell查询和切换

  • 查看已安装的Shell

    cat /etc/shells
    

    在这里插入图片描述

  • 查看当前Shell(查看$SHELL环境变量

    echo $SHELL
    

    在这里插入图片描述

  • 更改Shell(需要重启服务

    chsh -s /bin/sh
    

三、Shell基础语法

  • shell脚本可以编写在一个xxx.sh结尾的文件中,xxx.sh文件我们称为shell脚本文件
  • shell脚本文件是一个可执行文件,类似于windows环境中的xxx.exe或xxx.bat等文件

1、注释

  在Shell脚本中,注释是用来解释代码的内容,Shell脚本中的注释使用#符号表示,任何在#后面的内容都会被Shell解释器忽略。

  1. 单行注释(用#开头的内容作为注释)

    # 这是一个单行注释
    echo "Hello, World!" # 这也是一个注释
    
    • echo命令用于在终端上输出文本或变量的值,主要用于显示信息调试脚本
  2. 多行注释(可以通过连续的#来实现多行注释)

    # 这是一个多行注释
    # 它可以扩展到
    # 多行
    

    也可以用以下形式:

    : '
    这是一个多行注释
    它使用 : 和单引号来包裹
    解释器会忽略这些内容
    '
    

示例

  • 一个简单的脚本文件
  • #!/bin/bash在 Shell 脚本的第一行,表示该脚本应该用哪个解释器运行
  • 可以省略,如果省略会使用当前会话的默认shell解释器
    #!/bin/bash
    # 打印 "Hello, World!"
    echo "Hello, World!"
    
  • 查看文件权限(默认没有执行权限)
    在这里插入图片描述
  • 修文件权限(添加执行权限)
    chmod +x script.sh
    # 或者
    chmod 744 script.sh
    
  • 执行文件
    ./script.sh
    

2、本地变量

  本地变量是指在某个脚本函数的作用范围内定义的变量,只能在该作用范围内访问。本地变量的生命周期仅限于创建它的脚本或函数,执行完毕后,变量会自动销毁

本地变量命名规则

  1. 变量名由字母数字下划线组成(字母一般是小写,环境变量用大写)
  2. 不能以数字开头
  3. 区分大小写
  4. 等号两侧不能有空格
  5. 不能使用特殊字符作为变量名,如$、&、!、*等

示例

  • 双引号允许引用变量,变量会被解析
  • 单引号不会解析变量,原样输出
#!/bin/bash
name="Alice"

echo "Hello, $name"   # 输出:Hello, Alice
echo 'Hello, $name'   # 输出:Hello, $name

3、环境变量

  • 环境变量是一个包含键值对的变量,键(变量名)和值共同保存系统配置信息用户定义的信息
  • 环境变量一般是全部大写,单词和单词之间采用下划线分割。如:0JAVA_HOME, CATALINA_HOME
  • 环境变量是在Shell会话外设置的,可以由多个脚本和进程共享

常见的环境变量

变量名说明
PATH指定系统查找可执行文件的路径(如/usr/bin:/bin:/usr/local/bin
HOME当前用户的主目录路径(如/root
USER当前用户名(如root
PWD 当前工作目录路径(如/root/test
SHELL当前用户使用的默认 Shell(如/bin/bash
LANG系统语言和字符编码信息(如 en_US.UTF-8
TERM当前终端的类型(如xterm-256color
LOGNAME当前登录的用户名(如root

3.1、查看环境变量

  1. 查看当前所有环境变量

    printenv
    # 或者
    env
    

    在这里插入图片描述

  2. 查看或使用某个环境变量(使用环境变量,在变量名称前必须加上$符号)

    echo $PATH
    

    在这里插入图片描述

  3. 在脚本中直接访问环境变量

    #!/bin/bash
    echo "当前用户是:$USER"
    echo "主目录是:$HOME"
    

3.2、临时设置环境变量

  • 临时设置的环境变量只在当前会话中有效,会话结束后失效
  • 使用export设置环境变量

基本语法

export 变量名=

示例:

export MY_VAR="Hello World"
echo $MY_VAR

环境变量中多个值使用:分隔符

export CLASSPATH=/lib:/usr/lib:/home/user/myapp/lib

# 通过 PATH 的已有值加上新路径
export PATH=$PATH:/new/path

3.3、永久设置环境变量

  • 要使环境变量在每次系统启动后都生效,需要将其添加到配置文件

添加到用户配置文件

  • 将环境变量添加到~/.bashrc~/.bash_profile中(针对 Bash Shell)
    export JAVA_HOME=/usr/local/java/jdk1.8.0_371
    export PATH=$JAVA_HOME/bin:$PATH
    
  • 重新加载配置文件
    source ~/.bashrc
    

添加到系统全局配置文件

  • 将环境变量添加到/etc/profile中(对所有用户生效)
    export JAVA_HOME=/usr/local/java/jdk1.8.0_371
    export PATH=$JAVA_HOME/bin:$PATH
    
  • 重新加载配置文件
    source /etc/profile
    

4、特殊变量

  • 特殊变量是在Shell中预定义的变量名称,具有特殊的含义

常见特殊变量

  • $0: 当前脚本的文件名
  • $1, $2...: 脚本参数列表中的第1个、第2个参数等等
    • 如:./first.sh abc def,在执行这个脚本时,第一个参数abc,第二个参数def
  • $#: 脚本参数的数量
  • $*: 所有脚本参数的列表
    • 将所有的参数作为一个字符串:“a b c”
  • $@: 所有脚本参数的列表
    • 将每一个参数作为一个独立的字符串:“a” “b” “c”
  • $$: 当前脚本的进程ID号
  • $?: 上一个命令的退出状态,一个数值
    • 0表示成功,其他值表示失败
  • $!:后台运行的最后一个进程的进程ID

本地变量命名规则

  • 创建脚本script.sh
#!/bin/bash

# 脚本名
echo "脚本名称: $0"

# 参数个数
echo "参数总数: $#"

# 打印所有参数
echo "所有参数 (\$@): $@"
echo "所有参数 (\$*): $*"

# 第一个和第二个参数
echo "第一个参数: $1"
echo "第二个参数: $2"

# 当前脚本的 PID
echo "当前脚本的 PID: $$"

# 执行一个后台命令
sleep 5 &
echo "最后一个后台进程的 PID: $!"

# 判断上一个命令是否执行成功
echo "上一个命令执行成功 (返回值: $?)"

# 执行一个错误命令测试返回值
ls /nonexistent/path &>/dev/null
echo "错误命令返回非零值 (返回值: $?)"
  • ./script.sh arg1 arg2 arg3运行脚本,输出如下:

在这里插入图片描述

5、控制语句

5.1、shell中的中括号

  • 用于比较操作符:用于比较两个值的大小或者判断两个值是否相等
    • -eq: 等于,例如[ $a -eq $b ]
    • -ne: 不等于,例如[ $a -ne $b ]
    • -lt: 小于,例如[ $a -lt $b ]
    • -gt: 大于,例如[ $a -gt $b ]
    • -le: 小于等于,例如[ $a -le $b ]
    • -ge: 大于等于,例如[ $a -ge $b ]
  • 用于测试表达式:用于测试某个表达式是否成立
    • -f: 判断某个文件是否存在且是一个文件,例如[ -f file.txt ]
    • -d: 判断某个文件是否存在且是一个目录,例如[ -d dir ]
    • -z: 判断某个字符串是否为空,例如[ -z “$str” ]
    • -n: 判断某个字符串是否非空,例如[ -n “$str” ]
    • -e: 判断某个文件或目录是否存在,例如[ -e file.txt ]
    • 测试表达式可以用中括号[]或者test命令实现,例如:test -f file.txt等价于[ -f file.txt ]
  • 要注意两个值之间必须有空格分隔,否则会出现语法错误

5.2、if语句

基本语法

if condition 
then
  command1
  command2
  ...
elif condition2 
then
  command3
  command4
  ...
else
  command5
  command6
  ...
fi

示例:

#!/bin/bash

if [ -f file.txt ] 
then
  echo "file.txt文件存在"
elif [ -d dir ] 
then
  echo "dir目录存在"
else
  echo "file.txt and dir都没找到"
fi

5.3、for循环

基本语法

for var in list
do
  command1
  command2
  ...
done

  其中,var是一个临时的变量名,用于存储当前循环的值,list是一个值或者多个带有空格换行符分隔的值组成的列表。

示例:

#!/bin/bash

for i in 1 2 3 4 5
do
  echo "The value of i is: $i"
done

5.4、while循环

基本语法

while condition
do
  command1
  command2
  ...
done

  在shell编程中$((...))被称为算术扩展运算符,做数学运算的,并且将运算结果返回。$(...)运算符会将结果直接返回

示例:

#!/bin/bash

j=0
while [ $j -lt 5 ]
do
  echo "The value of j is: $j"
  j=$((j+1))
done

5.5、until循环

  until循环用于不断执行语句块,直到满足指定条件为止。和while循环相反,while是直到指定条件为假时才会停止循环。

基本语法

until condition
do
  command1
  command2
  ...
done

示例:

#!/bin/bash

k=0
until [ $k -ge 5 ]
do
  echo "The value of k is: $k"
  k=$((k+1))
done

5.6、break和continue语句

  break语句用于跳出当前循环块,例如在for循环和while循环中使用该语句时,可以跳出当前循环并停止迭代。

  continue语句用于跳过本次循环迭代,直接进入下一次的迭代。

示例:

#!/bin/bash

for l in 1 2 3 4 5
do
  if [ $l -eq 3 ] 
	then
    continue
  fi
  echo "The value of l is: $l"
  if [ $l -eq 4 ] 
	then
    break
  fi
done

输出结果(等于3跳过,等于4跳出循环结束)

1
2

6、函数

  在Shell脚本中,函数是一种封装代码的方式,可以提高代码的重用性和可读性。

6.1、函数的定义和调用

基本语法

function_name() {
    # 函数体:执行的命令或脚本
}

或者:

function function_name() {
    # 函数体:执行的命令或脚本
}

示例

say_hello() {
    echo "Hello, World!"
}

# 调用函数
say_hello

6.2、带参数的函数

  函数可以通过位置参数($1, $2, …)接收输入参数,类似于脚本中的参数。

示例

greet() {
    echo "Hello, $1! Welcome to $2."
}

# 调用函数并传递参数
greet "Alice" "Linux"

说明:

  • $1 表示第一个参数,$2 表示第二个参数,以此类推
  • 参数之间用空格分隔

6.3、将函数定义在 Shell 配置文件中

  如果希望在 任何地方都可以调用函数,可以将函数定义放入Shell的配置文件中,例如~/.bashrc~/.zshrc

方法

  1. 编辑 ~/.bashrc(或 ~/.zshrc),添加函数定义
    greet() {
        echo "Hello, $1!"
    }
    
  2. 保存文件后,运行以下命令重新加载配置
    source ~/.bashrc
    
    
  3. 现在,你可以在任何命令行终端调用该函数
    greet "Alice"
    

7、重启springboot项目脚本

# 1. 定义服务端口
port=1514

# 2. 查找并杀掉正在运行的进程
pid=$(lsof -t -i:$port)
if [ -n "$pid" ]; then
  echo "杀掉$port端口进程"
  kill -9 $pid
else
  echo "没有端口为$port的进程"
fi

# 3. 启动新进程
cd /data/java
nohup java -jar my-springboot.jar > /data/log/boot.log 2>&1 &

echo "$port端口的服务已重启"

四、Shell的执行方式

  在Linux系统中,运行Shell脚本(如 .sh 文件)有多种方式。以下是常见的几种执行方式及它们的区别。

1、使用指定Shell解释器

基本语法

sh script.sh

或者

bash script.sh

特点

  • 使用指定的Shell解释器运行脚本(如 shbash
  • 无需给脚本赋执行权限,只要有读权限即可

2、使用chmod赋执行权限后运行

步骤

  1. 给脚本赋执行权限
    chmod +x script.sh
    
  2. 直接运行脚本
    ./script.sh
    
    或者完整路径
    /path/to/script.sh
    

特点

  • 根据脚本开头#!/bin/bash解释器运行,如果没有使用当前Shell默认解释器
  • 必须给脚本文件赋予执行权限

3、使用当前Shell解释器

语法

. script.sh

或者

source script.sh

特点

  • 使用当前Shell默认的解释器
  • 脚本在当前Shell环境中运行,不会启动新的子Shell
  • 脚本中的变量和修改会直接影响当前Shell环境
  • 无需给脚本赋执行权限,只要有读权限即可

4、将脚本放入系统PATH

  如果希望脚本在任何地方都可以运行,可以将脚本文件放入$PATH中的目录(如/usr/local/bin~/bin

示例

  1. 将脚本移动到系统目录
    mv script.sh /usr/local/bin
    
  2. 确保脚本可执行
    chmod +x /usr/local/bin/script.sh
    
  3. 直接调用脚本
    script.sh
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zemax 序列模式下的扩束器

扩束器结构原理 扩束器用于增加准直光束(例如激光束)的直径,同时保持其准直。它通常用于激光光学和其他需要修改光束大小或发散度的应用。 在典型的扩束器中,输入光束是准直激光器,或光束进入第一个光学元件。当光束开…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

探秘MetaGPT:革新软件开发的多智能体框架(22/30)

一、MetaGPT 引发的 AI 变革浪潮 近年来&#xff0c;人工智能大模型领域取得了令人瞩目的进展&#xff0c;GPT-3、GPT-4、PaLM 等模型展现出了惊人的自然语言处理能力&#xff0c;仿佛为 AI 世界打开了一扇通往无限可能的大门。它们能够生成流畅的文本、回答复杂的问题、进行创…

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配给某个进程/线程。 实际应用中用到的模型&#xff1a; 单 Reactor 单进程 单 Reactor 多线程 优点&#xff1a;能充分利用多核CPU性能。 缺点&#xff1a;存在多线程竞争共享资源…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…

【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解

一、Dify & DMXAPI 1、Dify DIFY&#xff08;Do It For You&#xff09;是一种自动化工具或服务&#xff0c;旨在帮助用户简化操作&#xff0c;减少繁琐的手动操作&#xff0c;提升工作效率。通过DIFY&#xff0c;用户能够快速完成任务、获取所需数据&#xff0c;并且可以…

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中&#xff0c;通过AI寻边技术自动识别布匹的边缘&#xff0c;将检测到的边缘信息输出&#xff0c;确保裁剪的准确性&#xff0c;减少浪费&#xff0c;并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉&#xff0c;且误差小…

http range 下载大文件分片

摘自&#xff1a;https://www.jianshu.com/p/32c16103715a 上传分片下载也能分 HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 检测服务器端是否支持范围请求 假…

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…

【巨实用】Git客户端基本操作

本文主要分享Git的一些基本常规操作&#xff0c;手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置&#xff08;第一次使用或者需求变更的时候&#xff09;&#xff0c;告诉git未来是谁在提交代码 git config --global user.na…

腾讯云AI代码助手编程挑战赛:自动生成漂亮的网页

在当今数字化时代&#xff0c;网页设计和开发已经成为一项至关重要的技能。在当今时代&#xff0c;借助AI的力量&#xff0c;这部分工作变得简单。本文借助腾讯云AI代码助手——“自动生成需要的网页”。本文将详细介绍如何利用AI代码助手生成网页素材&#xff0c;帮助你轻松打…

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候&#xff0c;在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接&#xff0c;但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse&#xff0c;通过移动光标在不同的 pc 间切换 s…

UOS系统mysql服务安装

UOS系统mysql服务安装 背景 1、安装环境&#xff1a;kvm虚拟机2、运行环境&#xff1a;uos server-1060e3、架构&#xff1a;x864、安装mysql版本&#xff1a;mysql-5.71、安装准备 # Mysql官网 https://downloads.mysql.com/archives/community/ # 下载安装包 wget -i -c …

Binlog实现MySQL主从同步

主从复制原理 ● Master 数据库只要发生变化&#xff0c;立马记录到Binary log 日志文件中 ● Slave数据库启动一个I/O thread连接Master数据库&#xff0c;请求Master变化的二进制日志 ● Slave I/O获取到的二进制日志&#xff0c;保存到自己的Relay log 日志文件中。 ● Sla…