Linux中shell介绍

article/2025/6/8 5:23:49

一、脚本实践

脚本示例1

-- 直接编辑并创建一个文件
vim bak.sh-- 写入下面这句话
# 获取ip地址信息
ifconfig ens33 | grep -w inet | awk '{print $2}' | xargs echo "IP: "
-- 运行bak文件
bash bak.sh或者-- 添加可执行权限
chmod a+x bak.sh./bak.sh或者source bak.sh

检查脚步是否有错误

调试方式

-n        检查脚本中的语法错误
-v        先显示脚本所有内容,然后执行脚本,结果输出,如果执行遇到错误,将错误输出。
-x        将执行的每一条命令和执行结果都打印出来

语法

bash 【选项】 【文件名】

二、shell变量

2.1 变量分类

shell 中的变量分为三大类:
    本地变量        变量名仅仅在当前终端有效    
    全局变量        变量名在当前操作系统的所有终端都有效
    shell内置变量    shell解析器内部的一些功能参数变量

注意:
    这里的变量分类的特点仅仅是从字面上来理解的,因为在实际的操作的时候,还会涉及到环境优先级的问题
    所以生产中对于这三者的划分没有特别大的强制。

局部变量示例:

-- 定义局部变量
name=lshecho $name

注意:定义变量不要空格

-- 错误示例
name1 = lsh

现在定义的局部变量只对当前的终端生效,当你关闭虚拟机的时候,再重新登录,就没有这个变量

全局变量示例:

vim /etc/profilename2=jack

临时全局变量定义:

export qwe=jack
echo qwe

他们两个区别:

在于export定义的变量在系统重启后会消失

类型变量示例:

命令语法
    declare 参数 变量名=变量值
参数解析:
    -i 将变量看成整数 
    -r 使变量只读  readonly,该变量的值无法改变,并且不能为unset
    -x 标记变量为全局变量,类似于export
    -a    指定为索引数组(普通数组);查看普通数组
    -A 指定为关联数组;查看关联数组
注意:
    在生产场景中,这种方法比较鸡肋,使用频率 0-20次/3年

设定制定类型的变量值
[root@localhost ~]# declare -i mynum='shuzi'
[root@localhost ~]# echo $mynum
0
[root@localhost ~]# declare -i mynum='123456'
[root@localhost ~]# echo $mynum
123456
设定只读类型变量
[root@localhost ~]# declare -r myread1="aaa"
[root@localhost ~]# myread2=myread
[root@localhost ~]# readonly myread2查看只读变量
[root@localhost ~]# declare -r | grep myread
declare -r myread1="aaa"
declare -r myread2="myread"
[root@localhost ~]# readonly -p | grep myread
declare -r myread1="aaa"
declare -r myread2="myread"无法使用unset删除只读变量
[root@localhost ~]# unset myread1 myread2
bash: unset: myread1: 无法反设定: 只读 variable
bash: unset: myread2: 无法反设定: 只读 variable借助于exit方式删除只读变量
[root@localhost ~]# exit
...... 重新登录后再次查看
[root@localhost ~]# declare -r | grep myread
[root@localhost ~]#

命令变量:

定义方式一:变量名=`命令`注意:` 是反引号定义方式二:变量名=$(命令)

示例:

方法1设定变量名
[root@localhost ~]# myuser=`whoami`
[root@localhost ~]# echo $myuser
root

变量移除:

语法解析:

基本格式
unset 变量名
查看刚才定制的变量名
[root@localhost ~]#  echo $myname
shuji移除变量名
[root@localhost ~]# unset myname
[root@localhost ~]#  echo $myname[root@localhost ~]#

嵌套shell:

-- 编辑父脚本
vim father.sh-- 写入以下内容
#!/bin/bash
# 定制全局变量
export _xing='王'
_name="书记"
_age="42"
echo "父shell信息: $_xing$_name,$_age"
bash son.sh
sleep 3
-- 编辑子脚本
vim son.sh-- 写入以下内容
#!/bin/bash
# 显示父shell的全局变量
echo "子shell信息: $_xing$_name,$_age"
bash father.sh

内置变量:

| 序号 | 变量名 | 解析                                                         |
| ---- | ------ | ------------------------------------------------------------ |
| 1    | $0     | 获取当前执行的shell脚本文件名                                |
| 2    | $n     | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10} |
| 3    | $#     | 获取当前shell命令行中参数的总个数                            |
| 4    | $?     | 获取执行上一个指令的返回值(0为成功,非0为失败)  

编辑一个sc.sh脚本

字符串相关:

字符串计数
    ${#file}            获取字符串的长度

字符串截取    
    - 语法为${var:pos:length}   表示对变量var从pos开始截取length个字符,pos为空标示0
    ${file:0:5}            从0开始,截取5个字符
    ${file:5:5}            从5开始,截取5个字符
    ${file::5}            从0开始,截取5个字符
    ${file:0-6:3}        从倒数第6个字符开始,截取之后的3个字符
    ${file: -4}            返回字符串最后四个字节,-前面是"空格"

简单实践

定制字符串内容
[root@localhost ~]# string_context="dsjfdsafjkldjsklfajkdsa"
[root@localhost ~]# echo $string_context
dsjfdsafjkldjsklfajkdsa
获取字符串长度
[root@localhost ~]# echo ${#string_context}
23
从0开始,截取5个字符
[root@localhost ~]# echo ${string_context:0:5}
dsjfd从5开始,截取5个字符
[root@localhost ~]# echo ${string_context:5:5}
safjk	从0开始,截取5个字符
[root@localhost ~]# echo ${string_context::5}
dsjfd从倒数第6个字符开始,截取之后的3个字符
[root@localhost ~]# echo ${string_context:0-6:3}
ajk返回字符串最后四个字节,-前面是"空格"
[root@localhost ~]# echo ${string_context: -4}
kdsa	

默认值相关:

语法:

格式一:${变量名:-默认值}	变量a如果有内容,那么就输出a的变量值变量a如果没有内容,那么就输出默认的内容格式二:${变量名+默认值}	无论变量a是否有内容,都输出默认值

实践1 - 有条件的默认值

购买手机的时候选择套餐:如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"
[root@localhost ~]# select_default_value.sh
#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的手机套餐是: 套餐 ${a:-1}"

实践2 - 强制默认值

国家法律强制规定:不管我说国家法定结婚年龄是多少岁,都输出 国家法定结婚年龄(男性)是 22 岁	
[root@localhost ~]# froce_default_value.sh
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"

其他相关:

基础知识:

序号变量名解析
1$_在此之前执行的命令或脚本的第一个内容
2$@传给脚本的所有参数
3$*是以一个单字符串显示里所有向脚本传递的参数,与位置参数不同,参数可超过9个
4$$是脚本运行的当前进程的ID号,作用是方便以后管理它杀掉他
5$!前一条命令进程的ID号,作用是方便以后管理它杀掉他
[root@localhost ~]# vim get_other.sh-- 写入以下内容
#!/bin/sh
echo "脚本执行命令的第一个内容: $_"
echo "传递给当前脚本的所有参数是: $@"
echo "单字符串显示所有参数: $*"
echo "当前脚本执行时候的进程号是: $$"
sleep 5 &
echo "上一条命令执行时候的进程号是: $!"-- 然后运行
bash get_other.sh


http://www.hkcw.cn/article/ymFamyDnoI.shtml

相关文章

【智能制造】精读57页智慧工厂MES 项目解决方案【附全文阅读】

本文概述了智慧工厂MES项目解决方案在工业4.0背景下的整体框架与应用。智慧工厂以企业管理运营中心为核心,融合战略绩效、集团管控、决策分析及大数据分析平台,实现C2M(Consumer to Manufacturer)个性化订单处理。通过信息化系统平…

Stable Diffusion 技术原理解析与代码实践

1. 引言 Stable Diffusion 是由 Stability AI 开发的开源文本到图像生成模型,自 2022 年发布以来在创意产业和研究领域引起了广泛关注。它基于潜在扩散模型架构,能够根据文本描述生成高质量的图像内容,为艺术创作、设计和内容生成提供了强大工具。 2. 技术原理详解 2.1 扩…

Cursor + Claude 4:海外工具网站开发变现实战案例

项目背景 在全球数字化浪潮中,海外工具网站市场蕴含着巨大的商业机会。本文将详细介绍如何使用Cursor编辑器结合Claude 4 AI助手,开发一个面向海外用户的多功能工具网站"ToolBox Pro",并通过多元化策略实现有效变现。该项目在6个月…

AI 赋能名片设计:告别模板化,创造独特视觉风格

在商务社交与个人品牌传播中,名片是传递信息的重要载体,但千篇一律的模板设计往往让印象大打折扣。智能设计工具的出现,正以智能排版、创意生成和高效迭代的优势,颠覆传统名片设计范式。本文将推荐创客贴、Canva、Fotor 懒设计等多…

MCP:让AI工具协作变得像聊天一样简单 [特殊字符]

想象一下,你正在处理一个项目,需要从A平台查看团队讨论,从B平台获取客户信息,还要在GitHub上检查代码进度。传统做法是什么?打开三个不同的网页,在各个平台间来回切换,复制粘贴数据,最后还可能因为信息分散而遗漏重要细节。 听起来很熟悉?这正是当前工作流程的痛点所…

h5的aliplayer-min.js 加密视频会走到debugger

h5的aliplayer-min.js 如果 https://g.alicdn.com/apsara-media-box/imp-web-player/2.19.0/aliplayer-min.js走加密视频的话会有debugger 更换aliplayer-min.js版本解决了 https://g.alicdn.com/apsara-media-box/imp-web-player/2.25.1/aliplayer-min.js 对应css&#xff1a…

AgenticSeek:您的本地AI智能大脑,免费且私密

还在为昂贵的AI智能体订阅费望而却步吗?还在担心将敏感数据交由第三方处理的隐私风险吗?现在,一款名为AgenticSeek的AI工具横空出世,它承诺提供一个完全免费、100%本地化运行、且功能强大的AI智能体解决方案,旨在成为付…

活动选择问题一文详解

活动选择问题一文详解 一、活动选择问题描述1.1 问题定义1.2 示例说明 二、贪心算法求解策略2.1 贪心思想2.2 策略证明2.3 算法步骤 三、代码实现3.1 Python 实现3.2 C 实现3.3 Java 实现 四、复杂度分析4.1 时间复杂度4.2 空间复杂度 五、应用拓展5.1 资源分配5.2 任务调度优化…

xmake的简易学习

文章目录 1. xmake是什么2. 一个可执行程序3. 一个库文件4. 遍历文件用法5. 第三方库3.1 系统安装库3.2 独立库 6. 后续 由于前一篇博客的最后说要做一些rknn的优化,其实这个工作很早就完成了,但是我是使用 xmake这个来做我的工程的构建的,不…

【网络安全 | 信息收集】灯塔(资产收集工具)安装教程

文章目录 简介安装教程1.创建文件2.执行命令3.运行程序简介 ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统,旨在快速侦察与目标关联的互联网资产,构建基础资产信息库。 协助甲方安全团队或者渗透测试人员有效侦察和检索资产,发现存在的薄弱点和攻击面。 其特性如…

TCP小结

1. 核心特性 面向连接:通过三次握手建立连接,四次挥手终止连接,确保通信双方状态同步。 TCP连接建立的3次握手 抓包: client发出连接请求; server回应client请求,并且同步发送syn连接; clien…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

附件下载 联系工作人员获取附件 该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是四部分系列的第三部分,它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构…

【Redis】set 类型

set 一. set 类型介绍二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合间操作交集:sinter、sinterstore并集:sunion、sunionstore差集:sdiff、sdiffstore 三. set 命令小结四. set 内部编码方式五. set 使用场…

006网上订餐系统技术解析:打造高效便捷的餐饮服务平台

网上订餐系统技术解析:打造高效便捷的餐饮服务平台 在数字化生活方式普及的当下,网上订餐系统成为连接餐饮商家与消费者的重要桥梁。该系统以菜品分类、订单管理等模块为核心,通过前台展示与后台录入的分工协作,为管理员和会员提…

Python趣学篇:Pygame重现经典打砖块游戏

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、游戏背景与技术选型1. 打砖块游戏…

Transformer学习资料

​​核心论文​​ 原论文标题:《Attention Is All You Need》(Transformer原始论文) ​​Transformer学习资源​​ 视频教程: B站中文视频:Transformer详解 中文教程: GitHub项目:learn-nlp-wi…

AIGC 基础篇 高等数学篇 02导数与微分

声明:本文章仅用于复习,请不要将本文章当做预习篇或者讲解篇 此外,此文章不会包含全部的高等数学知识,仅仅是为了学习AI而进行的前期学习,因此知识含量不会很多,另外补充一句,博主已经对上一篇…

MQTTX连接阿里云的物联网配置

本文的目标是通过MQTTX的客户端,连接到阿里云的物联网的平台,发送温度信息,在阿里云的平台中显示出来。阿里云免费注册,免费有一个MQTT的服务器。有数量限制,但是对于测试来讲,已经足够。 1、注册阿里云的物…

06-排序

排序 1. 排序的概念及其应用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键…

MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片,用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后,转换为负载编 码输出,串行数据速率介于 120Mbps…