Shell编程知识整理

文章目录

    • 一、Shell介绍
      • 1.1 简介
      • 1.2 Shell解释器
    • 二、快速入门
      • 2.1 编写Shell脚本
      • 2.2 执行Shell脚本
      • 2.3 小结
    • 三、Shell程序:变量
      • 3.1 语法格式
      • 3.2 变量使用
      • 3.3 变量类型
    • 四、字符串
      • 4.1 单引号
      • 4.2 双引号
      • 4.3 获取字符串长度
      • 4.4 提取子字符串
      • 4.5 查找子字符串·`
    • 五、Shell程序:参数传递
      • 5.1 参数传递方式
      • 5.2 特殊字符
      • 5.3 `$*`和`$@`的区别
    • 六、Shell程序:运算符
      • 6.1 算术运算符
      • 6.2 关系运算符
      • 6.3 逻辑运算符
      • 6.4 字符串运算符
      • 6.5 文件测试运算符
    • 七、流程控制
      • 7.1 `if…else`
        • 格式1:单支
        • 格式2:双支
        • 格式3:多支
      • 7.2 `for`
        • 方式1:数值处理
        • 方式2:遍历数据集
      • 7.3 `while`
        • 方式1:条件判断循环
        • 方式2:数值循环(用`(( ))`)
      • 7.4 case


一、Shell介绍

1.1 简介

  • Shell是用C语言编写的程序,能让用户访问操作系统内核服务,类似DOS下的commandcmd.exe
  • 它兼具命令语言和程序设计语言的特性,Shell编程通常指编写Shell脚本,而非开发Shell自身。

1.2 Shell解释器

  • 进行Shell编程,只需文本编辑器(如vi)和脚本解释器。
  • Linux系统中有多种Shell解释器,可通过cat /etc/shells命令查看系统已安装的Shell。
  • bash因易用且免费,在日常工作中应用广泛,也是多数Linux系统的默认Shell。

二、快速入门

2.1 编写Shell脚本

  1. 创建文件:使用vi编辑器新建脚本文件,通常以.sh为扩展名(扩展名不影响脚本执行),例如vi hello.sh
  2. 脚本格式
    • 首行需指定解释器,格式为#!/bin/bash,告知系统该脚本使用的Shell解释器。
    • 后续编写具体代码,如echo "Hello World !"echo命令用于向窗口输出文本)。
  3. 赋予执行权限:新创建的脚本默认无执行权限,需通过chmod +x ./hello.sh命令赋予可执行权限。

2.2 执行Shell脚本

执行方式命令示例说明
当前目录执行./hello.sh告知系统在当前目录寻找并执行脚本,需先赋予执行权限
全路径执行/root/shelldemo/hello.sh通过完整路径指定脚本位置并执行,需先赋予执行权限
解释器参数执行sh hello.shsh /root/shelldemo/hello.sh直接运行解释器,将脚本作为参数,无需考虑脚本执行权限

2.3 小结

  • 用vi编辑器创建Shell程序文件,推荐以.sh为后缀名。
  • 程序基本组成包括变量、数据类型、运算符号、流程控制语句、数组和函数。

三、Shell程序:变量

3.1 语法格式

  • 定义格式:变量名=值,等号两边不能有空格。
  • 命名规则
    • 首个字符必须为字母(a-z,A-Z)。
    • 中间不能有空格,可使用下划线(_)。
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 命名惯例:通常为小写字母单词,多个单词间用“_”分隔,如name="bigdata.com",做到见名知其意。
    在这里插入图片描述

3.2 变量使用

  • 调用变量:在变量名前加$,如echo $name;也可加花括号${your_name},花括号用于帮助解释器识别变量边界,可选。
  • 重新定义:已定义的普通变量可重新赋值,如name="bigdata"后可再写name="hadoop"
  • 只读变量:用readonly命令定义,语法为readonly 变量名=值或先定义变量再执行readonly 变量名,只读变量的值不能被修改。
  • 删除变量:使用unset 变量名命令,不能删除只读变量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.3 变量类型

类型定义访问范围
局部变量在脚本或命令中定义仅在当前Shell实例中有效,其他Shell启动的程序无法访问
全局变量(环境变量)系统或用户配置所有程序(包括Shell启动的程序)都能访问,部分程序依赖其正常运行,可通过set命令查看

四、字符串

字符串是Shell编程中常用的数据类型,可使用单引号、双引号或不加引号定义。

4.1 单引号

  • 特性:单引号里的任何字符都会原样输出,变量无效;单引号字串中不能出现单独一个的单引号(转义后也不行),但可成对出现用于字符串拼接。
  • 示例:
    在这里插入图片描述

4.2 双引号

  • 优点:可识别变量,也可出现转义字符。
  • 示例:

在这里插入图片描述

4.3 获取字符串长度

  • 语法:${#字符串}
  • 示例:
    在这里插入图片描述
    b

4.4 提取子字符串

  • 从指定索引截取到最后:${字符串:索引}(索引从0开始)。

  • 从指定索引截取指定长度:${字符串:索引:长度}

  • 示例:

  • 注意:字符串中的空格也算一个字符。
    在这里插入图片描述

4.5 查找子字符串·`

  • 语法:expr index "$字符串" 子字符串(反引号`,位于Esc键下方,不是单引号’),位置从1开始计算。
  • 示例:
    在这里插入图片描述

五、Shell程序:参数传递

5.1 参数传递方式

  • 执行脚本时传递参数:./shell程序 [空格] 参数1 [空格] 参数2 …
  • 脚本内获取参数:用$n(n为数字),$1表示第一个参数,$2表示第二个参数,以此类推,$0表示当前脚本名称。
  • 示例:

在这里插入图片描述

在这里插入图片描述

5.2 特殊字符

特殊字符含义
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@$*相同,但使用时加引号,会在引号中返回每个参数
$?显示最后命令的退出状态,0表示无错误,其他值表示有错误

在这里插入图片描述
在这里插入图片描述

5.3 $*$@的区别

  • 相同点:都表示传递给脚本的所有参数。
  • 不同点
    • 不被""包含时:均以$1 $2… $n的形式组成参数列表。
    • ""包含时:"$*"将所有参数作为一个整体,以"$1 $2 … $n"形式组成整串;"$@"将各个参数分开,以"$1" "$2" … "$n"形式组成参数列表。

六、Shell程序:运算符

Shell支持算术、关系、逻辑、字符串等运算符,原生/bin/bash不支持简单数学运算,需借助expr(())$[]等实现。

6.1 算术运算符

实现方式语法/示例注意事项
b=expr 2 + 2`(反引号包裹)运算数和运算符之间要有空格;完整表达式需用`符号包含(非单引号)
(())((a ++))(自增)、((a=90+1))可直接进行算术运算,语法简洁
$(( ))val=$((1+1))将运算结果赋值给变量
$[]val=$[1+2]$(( ))类似,可直接进行算术运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2 关系运算符

  • 特性:仅支持数字,不支持字符串(字符串值为数字时除外)。
    |运算符|含义|示例(a=10,b=20)|
    | ---- | ---- | ---- |
    |-eq|检测两个数是否相等,相等返回true|[ $a -eq $b ](返回false)| =
    |-ne|检测两个数是否不相等,不相等返回true|[ $a -ne $b ](返回true)|>或<
    |-lt|检测左边的数是否小于右边,是则返回true|[ $a -lt $b ](返回true)|<
    |-gt|检测左边的数是否大于右边,是则返回true|[ $a -gt $b ](返回false)|>
    |-le|检测左边的数是否小于或等于右边,是则返回true|[ $a -le $b ](返回true)|<=
    |-ge|检测左边的数是否大于或等于右边,是则返回true|[ $a -ge $b ](返回false)|>=

6.3 逻辑运算符

运算符含义示例
-a双方都成立(and),用于if语句`if [ 1000>100
-o单方成立(or),用于if语句[ 1000>100 &&20>40 ]`
&&并且(and),可直接用echo测试echo "$[10>5 && 10%2==0]"(输出1,代表true)

在这里插入图片描述

6.4 字符串运算符

运算符含义示例(a=“abc”,b=“def”)
-n STRING字符串长度不为零(非空字符串)[ -n "$a" ](返回true)
-z STRING字符串长度为0(空字符串)[ -z "$a" ](返回false)
=判断两个字符串是否一样[ $a = $b ](返回false)
!=判断两个字符串是否不一样[ $a != $b ](返回true)

6.5 文件测试运算符

运算符含义示例
-f存在且是普通文件[ -f /root/hello.sh ]
-d存在且是目录[ -d /root/shelldemo ]
-s文件不为空[ -s /root/hello.sh ]
-e文件存在[ -e /root/hello.sh ]
-r文件存在并且可读[ -r /root/hello.sh ]
-w文件存在并且可写[ -w /root/hello.sh ]
-x文件存在并且可执行[ -x /root/hello.sh ]

在这里插入图片描述

在这里插入图片描述

七、流程控制

程序默认从上向下逐行执行,流程控制可实现选择执行或重复执行代码,Shell支持if…elseforwhilecase等语句。

7.1 if…else

格式1:单支
if [ 条件 ]; then# 条件成立时执行的命令
fi
  • 执行机制:判断一次,条件成立则执行命令,失败则无操作。
  • 示例:
#!/bin/bash
num1=$1
num2=$2
if [ $num1 -gt $num2 ]; thenecho "$num1 大于 $num2"
fi
# 执行命令:./ifdemo.sh 10 5,输出:10 大于 5

在这里插入图片描述

在这里插入图片描述

格式2:双支
if [ 条件 ]; then# 条件成立时执行的命令1
else# 条件失败时执行的命令2
fi
  • 执行机制:判断一次,条件成立执行命令1,失败执行命令2。
  • 示例:
#!/bin/bash
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
echo "$num1 大于 $num2"
else 
echo "$num1 小于或等于 $num2"
fi

在这里插入图片描述
在这里插入图片描述

格式3:多支
if [ 条件1 ]; then# 条件1成立执行的命令1
elif [ 条件2 ]; then# 条件2成立执行的命令2
...
else# 所有条件都不成立执行的默认命令
fi
  • 执行机制:多个判断条件,每个条件对应一个结果;若第一个条件成立,执行对应命令后不再判断后续条件;所有条件均不成立则执行else下的命令。
  • 示例:
#!/bin/bash
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
echo "$num1 大于 $num2"
elif [ $num1 -lt $num2 ];then
echo "$num1 小于 $num2"
else
echo "$num1 等于 $num2"
fi

在这里插入图片描述
在这里插入图片描述

7.2 for

循环用于重复性执行代码,需避免死循环,通常包含循环初始值、循环条件、修改循环条件。

方式1:数值处理
for ((循环初始值; 循环条件; 修改循环条件))
do# 循环体代码
done
  • 示例1:打印5次Hello World
#!/bin/bash
for ((i=0;i<5;i++))
doecho "$i - Hello World~"
done
# 输出:0 - Hello World~ 、1 - Hello World~ … 4 - Hello World~

在这里插入图片描述
在这里插入图片描述

  • 示例2:求10以内数值的累加和
#!/bin/bash
count=0  # 存储累加结果
for((i=1;i<=10;i++))
docount=$(($count+$i));
done
echo "累加后的值:${count}";  # 输出:累加后的值:45

在这里插入图片描述
在这里插入图片描述

方式2:遍历数据集
for var in 数据1 数据2 数据3 …
do# 循环体代码($var依次取数据集里的每个值)
done
  • 示例1:打印指定目录下所有文件名
#!/bin/bash
#ck=$(ls /dev/)
file=$1
#read -p "请输入文件位置:" file
ck=$(ls $file)
for ck1 in $ck
do
echo $ck1
done

在这里插入图片描述

在这里插入图片描述

7.3 while

方式1:条件判断循环
while [ expression ]
do# 循环体命令# 修改循环条件(避免死循环)
done
  • 示例:输入yes/YES停止循环
#!/bin/bash
while [ "$a" != "yes" -a "$a" != "YES" ]
doecho "请输入yes/YES停止循环:"read a  # 接收键盘录入的值
done
echo "循环停止了!";
# 执行后,输入非yes/YES会继续提示,输入yes/YES则停止循环

在这里插入图片描述
在这里插入图片描述

方式2:数值循环(用(( ))
初始化变量
while((循环条件))
do# 循环体命令# 修改循环条件(如let 变量++或((变量++)))
done
  • let命令:BASH中用于计算的工具,执行表达式,变量计算无需加$,如let no++(自加)、let no--(自减)。
  • 示例:计算10以内数值的累加和
#!/bin/bash
count=0  # 记录累加值结果
num=1    # 循环初始值
while((num<=10))
docount=$[$count+$num]let num++  # 修改循环条件
done
echo "10以内数值的累加和:${count}";  # 输出:10以内数值的累加和:55

在这里插入图片描述
在这里插入图片描述

7.4 case

#!/bin/bash
case $1 in
“start”)
systemctl start httpd
echo “启动服务”
;;

“stop”)
systemctl stop httpd
echo “httpd服务已关闭”
;;

“restart”)
systemctl stop httpd
systemctl start httpd
echo “服务已重启”
;;
*)
echo “请输入正确值:{start/stop/restart}”

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

AI与低代码的激情碰撞:微软Power Platform融合GPT-4实战之旅

引言 在当今数字化飞速发展的时代,AI 与低代码技术正成为推动企业变革的核心力量。AI 凭借其强大的数据分析、预测和决策能力,为企业提供了智能化的解决方案;而低代码开发平台则以其可视化、快速迭代的特性,大大降低了应用开发的门槛和成本。这两者的结合,开启了一场全新的…

豆包1.6+PromptPilot实战:构建智能品牌评价情感分类系统的技术探索

豆包1.6PromptPilot实战&#xff1a;构建智能品牌评价情感分类系统的技术探索 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;…

如何在VsCode中使用git(免敲命令版本!保姆级!建议收藏!)

目录 文章目录 前言 一、电脑安装git 二、在vscode安装git插件 三、克隆仓库 四、提交代码 五、创建分支、切换分支、合并分支 1、创建分支 2、切换分支 3、合并分支 六、创建标签和推送标签 七、解决冲突 八、拉取、抓取仓库 九、Reivew代码 总结 前言 随着Vscode的推出和普及…

3.kafka常用命令

在 0.9.0.0 之后的 Kafka&#xff0c;出现了几个新变动&#xff0c;一个是在 Server 端增加了 GroupCoordinator 这个角色&#xff0c;另一个较大的变动是将 topic 的 offset 信息由之前存储在 zookeeper 上改为存储到一个特殊的 topic&#xff08;__consumer_offsets&#xff…

主从DNS和Web服务器搭建过程

完整服务器搭建流程 环境说明 主服务器&#xff1a;192.168.102.128 - DNS Web 从服务器&#xff1a;192.168.102.133 - 从DNS 网站&#xff1a;www.zhangsan.com (HTTPS加密)、www.lisi.com (HTTP) 手动配置主服务器和从服务器的ip地址&#xff0c;dns&#xff0c;网关…

信号无忧,转决千里:耐达讯自动化PROFIBUS集线器与编码器连接术

在工业自动化领域&#xff0c;尤其是高端装备制造、智能产线、精密运动控制等场景中&#xff0c;系统稳定性与信号实时性一直是工程师关注的核心。随着设备智能化程度不断提高&#xff0c;编码器作为运动控制的关键反馈元件&#xff0c;其数量与分布密度显著增加&#xff0c;对…

大模型微调示例四之Llama-Factory-DPO

大模型微调示例四之Llama-Factory-DPO一、强化学习数据处理二、配置训练文档三、模型预测一、强化学习数据处理 原始数据地址&#xff1a;https://nijianmo.github.io/amazon/index.html 第一步&#xff1a;读取 video game 信息 import codecs, json, re from random impor…

Java 将HTML文件、HTML字符串转换为图片

在 Java 开发中&#xff0c;我们经常会遇到将 HTML 内容转换为图片的需求&#xff0c;比如生成网页报告截图、电商商品详情页预览图、在线文档缩略图等。本文将介绍如何使用 Free Spire.Doc for Java 库来实现这一功能。 Free Spire.Doc for Java 是一款免费库且无需任何依赖&a…

(Arxiv-2024)VideoMaker:零样本定制化视频生成,依托于视频扩散模型的内在力量

VideoMaker&#xff1a;零样本定制化视频生成&#xff0c;依托于视频扩散模型的内在力量 paper title&#xff1a;VideoMaker: Zero-shot Customized Video Generation with the Inherent Force of Video Diffusion Models paper是ZJU发布在Arxiv 2024的工作 Code:链接 图1. 我…

录屏、助眠、翻译

01【小熊录屏】 02【全球翻译】 03【声萌助眠】 03 软件获取 小熊录屏&#xff08;点击下载&#xff09; 声萌助眠&#xff08;点击下载&#xff09; 全球-译官&#xff08;点击下载&#xff09;

第17章|PowerShell 安全警报——高分学习笔记(运维实战向)

&#x1f6e1;️ 第17章&#xff5c;PowerShell 安全警报——高分学习笔记&#xff08;运维实战向&#xff09;一句话核心&#xff1a;PowerShell 的“安全设计目标”是——不替你越权&#xff1b;尽量防“误触发不可信脚本”&#xff1b;并非反恶意软件的最后防线。1&#xff…

哈希表性能对比:uthash、hsearch与Linux内核哈希表的深度解析

引言 在网络编程和高性能服务器开发中,高效的数据结构是保证系统性能的关键。本文基于对三种主流哈希表实现(uthash、hsearch和Linux内核哈希表)的深度测试,探讨它们在处理50,000个客户端连接时的性能表现、内存效率及适用场景。 测试环境与方法 测试数据结构 我们使用…

探索 XGBoost 与 LightGBM 的差异:哪个更适合你的项目?

轻松对比&#xff1a;XGBoost 和 LightGBM 的差异与选择指南 在机器学习领域&#xff0c;梯度提升树&#xff08;GBDT&#xff09;是一种广泛使用的算法&#xff0c;而 XGBoost 和 LightGBM 是两款最受欢迎的 GBDT 实现。它们都能够显著提高模型的准确性&#xff0c;但它们之间…

C++链表双杰:list与forward_list

在C容器的世界里&#xff0c;当我们需要频繁地在序列中间进行插入和删除时&#xff0c;基于数组的 vector 会显得力不从心。这时&#xff0c;链表结构就闪亮登场了。STL提供了两种链表容器&#xff1a;功能全面的双向链表 std::list 和极致轻量化的单向链表 std::forward_list。…

Ruoyi-vue-plus-5.x第一篇Sa-Token权限认证体系深度解析:1.4 Sa-Token高级特性实现

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; Sa-Token高级特性实现 前言 在前面的文章中&#xff0c;我们学习了Sa-Token的…

Linux 服务器初始化解析和ssh密钥交换的介绍

目录 2. SSH 基于密钥交换的介绍和原理 2.1 核心优势 2.2 密钥交换原理&#xff08;非对称加密体系&#xff09; 2.3 基础配置步骤 3. 服务器初始化 3.1 安装 yum 网络源 3.1.1 背景说明 3.1.2 实操步骤 3.2 安装运维的必备工具 3.2.1 工具清单 3.2.2 批量安装命令 …

web渗透ASP.NET(Webform)反序列化漏洞

web渗透ASP.NET(Webform)反序列化漏洞1&#xff09;ASP.NET(Webform)反序列化漏洞ASP.NET(Webform) 反序列化漏洞的核心触发点是 Webform 框架中的VIEWSTATE参数 —— 该参数用于存储页面控件状态数据&#xff0c;默认以 Base64 编码传输&#xff0c;内部包含序列化的对象数据。…

Android FrameWork - 开机启动 SystemServer 进程

基于安卓 12 源码分析相关类&#xff1a;frameworks/base/core/java/com/android/internal/os/ZygoteInit.java frameworks/base/core/java/com/android/internal/os/Zygote.java frameworks/base/core/java/com/android/internal/os/RuntimeInit.java frameworks/base/service…

C++:list容器--模拟实现(下篇)

1. 模拟实现 list 一些常用接口// list.h #pragma once #include <assert.h> #include "Iterator.h"namespace room {template<class T>struct list_node{list_node<T>* _next;list_node<T>* _prev;T _data;list_node(const T& x T()):…

边缘计算:一场由物理定律发起的“计算革命”

专栏引言:在前面的文章中,我们探讨了云计算如何将计算资源变成了“数字水电煤”,构建了一个强大的中心化数字帝国。然而,当这个帝国试图将它的触角伸向物理世界的每一个角落时,却遭遇了两位“上古之神”的无情阻击——光速与带宽。今天,我们将聚焦于一场由物理定律发起的…