【网络运维】Shell:变量进阶知识

Shell 变量进阶知识

Shell 中的特殊变量

位置参数变量

Shell 脚本中常用的位置参数变量如下:

  • $0:获取当前执行的 Shell 脚本文件名(包含路径时包括路径)
  • $n:获取第 n 个参数值(n>9 时需使用 ${n}
  • $#:获取参数个数
  • $*:获取所有参数(加双引号时视为单个字符串)
  • $@:获取所有参数(加双引号时保留各参数独立性)

示例:

#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第十个参数: ${10}"
echo "参数个数: $#"
echo "所有参数: $*"
echo "所有参数: $@"
echo "带引号的参数: $@"

执行结果:

$ bash showargs.sh {a..z}
脚本名称: showargs.sh
第一个参数: a
第二个参数: b
第十个参数: j
参数个数: 26
所有参数: a b c d e f g h i j k l m n o p q r s t u v w x y z
所有参数: a b c d e f g h i j k l m n o p q r s t u v w x y z
带引号的参数: a b c d e f g h i j k l m n o p q r s t u v w x y z

进程状态变量

  • $?:获取上一条命令的退出状态(0 表示成功,非零表示失败)
  • $$:获取当前 Shell 进程的 PID
  • $!:获取上一个后台进程的 PID
  • $_:获取上一个命令的最后一个参数

示例:

$ ls /root
ls: 无法打开目录/root: 权限不够
$ echo $?
2$ echo $$
2447$ md5sum /dev/zero &
[1] 2611
$ echo $!
2611$ ls /etc/hosts /etc/fstab
$ cat $_
# 显示 /etc/fstab 内容

Shell 内置变量命令

echo 命令

echo 命令常用选项:

  • -n:不换行输出
  • -e:解析转义字符

转义字符:

  • \n:换行
  • \t:制表符
  • \b:退格

示例:

$ echo -n "Hello "; echo "World"
Hello World$ echo -e "Line1\nLine2"
Line1
Line2$ echo -e "Name\tAge"
Name    Age$ echo -e "123\b456"
12456

eval 命令

eval 命令会将参数组合成新命令并执行:

示例:

$ cat noeval.sh
echo \$$#
$ bash noeval.sh hello world
$2$ cat eval.sh
eval "echo \$$#"
$ bash eval.sh hello world
world

read 命令

从标准输入读取数据:

示例:

#!/bin/bash
read -p "请输入内容: " input
echo "您输入的内容是: $input"# 隐藏输入内容(适用于密码)
read -s -p "请输入密码: " password
echo
echo "密码已接收"

exec 命令

exec 命令会替换当前进程执行指定命令:

示例:

# 执行 sleep 命令替换当前 shell
$ exec sleep 10
# 10 秒后返回原 shell# 从文件读取内容
$ cat exec.sh
#!/bin/bash
seq 5 > /tmp/seq.log
exec < /tmp/seq.log
while read line
doecho $line
done

shift 命令

shift 命令用于移动位置参数:

示例:

$ cat shift.sh
#!/bin/bash
echo "第一个参数: $1"
shift
echo "shift 后的第一个参数: $1"$ bash shift.sh A B C
第一个参数: A
shift 后的第一个参数: B

Shell 变量子串处理

常用子串操作

  • ${parameter}:返回变量值
  • ${#parameter}:返回变量长度
  • ${parameter:offset}:从指定位置提取子串
  • ${parameter:offset:length}:提取指定长度子串
  • ${parameter#word}:从开头删除最短匹配
  • ${parameter##word}:从开头删除最长匹配
  • ${parameter%word}:从结尾删除最短匹配
  • ${parameter%%word}:从结尾删除最长匹配
  • ${parameter/pattern/string}:替换第一个匹配
  • ${parameter//pattern/string}:替换所有匹配

使用示例

$ str="abc123abc123"# 获取长度
$ echo ${#str}
12# 提取子串
$ echo ${str:3}
123abc123
$ echo ${str:3:4}
123a# 删除子串
$ echo ${str#a*c}
123abc123
$ echo ${str##a*c}
123# 替换子串
$ echo ${str/abc/def}
def123abc123
$ echo ${str//abc/def}
def123def123

实际应用案例

重命名文件:

[furongwang@shell ~]$ touch stu-202112-snap.jpg# 创建sh脚本文件
$ file="stu-202112-snap.jpg"
$ mv $file ${file/2021/2025}  # 改为 2025
$ mv $file ${file/-snap/}     # 删除 -snap

Shell 特殊扩展变量

常用扩展变量

  • ${parameter:-word}:变量为空时返回 word
  • ${parameter:=word}:变量为空时设置并返回 word
  • ${parameter:?word}:变量为空时输出错误信息
  • ${parameter:+word}:变量不为空时返回 word

使用示例

# 变量未定义
$ unset test
$ echo ${test:-DEFAULT}
DEFAULT# 变量定义
$ test=hello
$ echo ${test:-DEFAULT}
hello# 设置默认值
$ echo ${SHELL:=/bin/bash}
/bin/bash# 错误检查
$ unset test
$ echo ${test:?变量未定义}
-bash: test: 变量未定义

实际应用案例

Apache 启动脚本片段:

HTTPD_LANG=${HTTPD_LANG:-"C"}
httpd=${HTTPD:-/usr/sbin/httpd}
pidfile=${PIDFILE:-/var/run/httpd.pid}

安全删除文件:

#!/bin/bash
# 防止 path 变量未定义
find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f

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

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

相关文章

部署Qwen2.5-VL-7B-Instruct-GPTQ-Int3

模型下载 from modelscope import snapshot_download model_dir snapshot_download(ChineseAlpacaGroup/Qwen2.5-VL-7B-Instruct-GPTQ-Int3)相关包导入 import os import numpy as np import pandas as pd from tqdm import tqdm from datetime import datetime,timedelta fro…

sourcetree 拉取代码

提示&#xff1a;文章旨在于教授大家 sourcetree 拉取代码的方式&#xff0c;关于代码的提交合并等操作后续会补充。 文章目录前言一、sourcetree 安装二、http 与 ssh 拉取代码1.http 方式&#xff08;1&#xff09;生成 token&#xff08;2&#xff09;拼接项目的 url&#x…

epoll模型网络编程知识要领

1、程序初始化创建监听socket调用bind函数绑定ip地址、port端口号调用listen函数监听调用epoll_create函数创建epollfd调用epoll_ctrl函数将listenfd绑定到epollfd上&#xff0c;监测listenfd的读事件在一个无限循环中&#xff0c;调用epoll_wait函数等待事件发生2、处理客户端…

15-day12LLM结构变化、位置编码和投机采样

多头机制transformer结构归一化层选择 归一化层位置归一化层类型激活函数Llama2结构MoE架构 混合专家模型DeepSeek MLA为何需要位置编码目前的主流位置编码正余弦位置编码可学习位置编码ROPE旋转位置编码推导参考&#xff1a; https://spaces.ac.cn/archives/8265 https://zhua…

记录 docker容器打包成镜像 在其他服务器快速启动镜像和容器

我有个nginx服务器 需要在其他服务器直接部署使用 里面都是完整的 使用 docker ps 查看容器id 进行打包成镜像docker commit [容器ID或名称] 新镜像名:版本 docker commit 28f60e2206b2 my-nginx-custom:v1镜像保存成文件 docker save -o my-nginx-custom.tar my-nginx-custom:…

使用LLaMA-Factory对大模型进行微调-详解

书接上回 启动llama Factory可视化页面 llamafactory-cli webui 如果想后台运行 使用 nohup llamafactory-cli webui &浏览器访问 http://127.0.0.1:7860/配置项主要参数: 参考: https://docs.coreshub.cn/console/compute_platform/help/llama_factory/ 模型路径 : 解…

【AI】录制自动生成UI自动化脚本

命令行输入&#xff1a;npx playwright codegen https://myerp.dmyc.XXX.com:9443/打开的浏览器上操作&#xff0c;会自动录制&#xff0c;并生成自动化脚本

深度剖析字节跳动VeOmni框架

背景与设计动机 随着推荐系统和AI模型走向多模态、多任务的趋势&#xff0c;字节跳动面临着训练、迭代效率和系统复杂度的双重挑战。一方面&#xff0c;各类业务&#xff08;如新闻推荐、短视频、图文广告、电商带货等&#xff09;都需要处理文本、图像、视频、音频等多种输入模…

OCR库pytesseract安装保姆级教程

本文将介绍使用工具安装OCR库pytesseract的详细流程。 Anaconda安装教程参考Anaconda安装保姆级教程。 目录 一、工具安装 二、创建虚拟环境 三、安装pytesseract 总结 一、工具安装 点击链接前往官网codetou.com&#xff0c;下载安装最新版即可&#xff0c;本篇博客以抠头…

开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案

在即时通讯与社交需求日益增长的今天&#xff0c;一款安全、稳定、功能全面的聊天软件成为不少团队和开发者的刚需。但市面上多数聊天 APP 要么依赖第三方插件&#xff0c;面临数据安全隐患和高额服务费&#xff1b;要么功能单一&#xff0c;难以满足复杂社交场景。今天给大家推…

残差神经网络(ResNet)

残差神经网络&#xff08;Residual Neural Network&#xff0c;简称 ResNet&#xff09;是深度学习领域的里程碑式模型&#xff0c;由何凯明等人在 2015 年提出&#xff0c;成功解决了深层神经网络训练中的梯度消失 / 爆炸问题&#xff0c;使训练超深网络&#xff08;如 152 层…

学习嵌入式之驱动

一、基础搭建1.基础&#xff1a;c语言 软件编程语言 数据结构 软件编程思想2.驱动实现目标如果将Linux系统细致到开发板平台上&#xff1f; Liunx系统与硬件设备的适配3.自我能力的锻炼继续强化C语言锻炼大型代码阅读和分析能力学习大型项目的代码搭建和管理的能力…

在 Golang 中复用 HTTP 连接

问题提出最近在实现一个转发大模型调用请求的中转功能&#xff0c;涉及到要构造client发送请求的内容&#xff0c;一开始我每次都是新建一个client来发送请求&#xff0c;这样的代码实现存在一些问题——每次都要构造新的client&#xff0c;并且要重新建立连接。后面了解到在Go…

前端:el-upload文件上传与FormData 对象

<el-uploadclass"uploadDemo":limit"1"dragaccept".xls,.xlsx" <!-- 只保留Excel格式 -->:on-exceed"handleExceedFileLimit":on-change"handleChangeExcelFile":on-remove"handleRemoveExcelFile":bef…

自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec

文章目录自然语言处理&#xff08;NLP&#xff09;一、什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f;二、NLP 的核心目标三、NLP 的主要应用方向&#xff08;应用场景&#xff09;四、NLP 的基本概念五、NLP 的基本处理流程1. 文本预处理2. 特征表示3. 模型选择与…

单词记忆-轻松记忆10个实用英语单词(13)

1. board含义&#xff1a;板子&#xff1b;董事会&#xff1b;登机 读音标注&#xff1a;/bɔːrd/ 例句&#xff1a;Write your name on the board. 译文&#xff1a;把你的名字写在板上。 衍生含义&#xff1a;董事会&#xff08;如“board of directors”&#xff09;&#…

Spring循环依赖源码调试详解,用两级缓存代替三级缓存

Spring循环依赖源码详解&#xff0c;改用两级缓存并实验 背景 最近一直在研究Spring的循环依赖&#xff0c;发现好像两级缓存也能解决循环依赖。 关于为何使用三级缓存&#xff0c;大致有两个原因 对于AOP的类型&#xff0c;保证Bean生命周期的顺序 对于有AOP代理增强的类型&am…

亚马逊BALL PIT球池外观专利侵权指控?不侵权意见书助力4条链接申诉成功!

儿童球池作为玩具品类中常见的一款产品&#xff0c;能够给儿童提供游乐的安全空间&#xff0c;深受亚马逊平台用户的喜爱。然而在近期&#xff0c;赛贝收到了部分亚马逊卖家的咨询&#xff0c;原因是他们在售的儿童球池产品链接被美国外观专利USD1009203S&#xff08;下称203专…

开源,LangExtract-Python库用LLM从非结构化文本提取结构化信息

摘要&#xff1a; LangExtract是一个Python库&#xff0c;利用大语言模型&#xff08;LLM&#xff09;根据用户定义指令从非结构化文本文档中提取结构化信息。它具备精确源定位、可靠结构化输出、长文档优化、交互式可视化、灵活LLM支持、适应任意领域等特点。可通过几行代码快…

如何根据团队技术能力选择最适合的PHP框架?

作为一名PHP开发者&#xff0c;面对众多的PHP框架&#xff0c;你是否曾感到选择困难&#xff1f;Laravel、Symfony、CodeIgniter、ThinkPHP…每个框架都有其特色和优势&#xff0c;但没有最好的框架&#xff0c;只有最适合的框架。而选择合适框架的关键因素之一&#xff0c;就是…