shell脚本编译与解析
文章目录
- shell
- 变量
- 全局变量(环境变量)
- 局部变量
- 设置PATH 环境变量
- 修改变量属性
- 启动文件
- 环境变量持久化
- ./和. 的区别
- 脚本编写
- 判断 和循环
- 命令行参数
- 传入参数
- 循环读取命令行参数
- 获取用户输入
- 处理选项
- 处理简单选项
- 处理带值选项
- 重定向
- 显示并且同时输出到文件
- 替换目录下的所有文件中某个关键字
- 删除关键字所在行
shell
shell的作用是将我们输入的命令与内核沟通。
linux默认使用的是bash shell
echo $SHELL
可以查看当前使用的shell版本
shell中如果想一次执行多条命令,可以用分号隔开,多条命令的组合可以放到一个文件中,我们把它叫做脚本。
date ; cd
这样就编写了一个非常简单的shell脚本。
变量
存储shell会话和工作环境的相关信息。
环境变量存储在内存中,以便shell中运行的脚本和程序能够访问。
环境变量分为:全局变量和局部变量
全局变量:对当前shell以及所有子shell可见
局部变量:只在当前shell可见,子shell不可见
所以全局变量和局部变量差异就是是否 可以被子进程使用
全局变量(环境变量)
set 查看当前shell所有变量,包括全局和局部
env 查看当前shell下所有环境变量(只能查看全局变量)
printenv HOME 查看某个全局环境变量的值
echo $HOME
查看环境变量
echo $$
查看当前shell的pid
export作用是将局部变量转换成全局变量
export my_all_home=/lib/lib
设定全局环境变量
子shell可以查看和使用但不能修改父shell中的全局环境变量
unset my_all_home 删除环境比哪里
局部变量
没有命令能够查看所有局部变量
设定局部变量 myhome=/lib/
查看某个局部变量
变量内若有空格可以使用双引号或者单引号myhome=/lib/ jj
设置PATH 环境变量
当输入一个外部命令时,shell会搜索系统从中找到对应程序。
PATH环境变量定义了用于查找命令和程序的目录。
如果要执行的外部命令在PATH中查找不到应用程序,则会报错。
如果要在PATH后继续添加路径,我们可以使用冒号累加
export PATH=$PATH:/lib
修改变量属性
变量默认是字符串类型
可以使用declare改变变量类型
declare -a var
将变量修改为数组类型
启动文件
- 在系统的启动shell中会启动/etc/profile 一旦启动shell就会执行该文件中的命令
- HOME目录下的启动文件。在启用一个新shell时会用到下面的启动文件
ls -a home目录可以看到
./bashrc ubuntu的home目录启动文件
环境变量持久化
所以./bashrc文件的作用就是我们可以将要使用的全局环境变量放到这个文件中,那么我们一旦开启新的shell则自动拥有这个环境变量
如果不想重启立即生效,则执行source ~/.bashrc
./和. 的区别
-
点空格斜杠执行脚本,是相当于source 执行脚本,也就是说在当前进程中执行命令,所以其中所有变量的设置会对当前Shell其作用。
-
点斜杠执行脚本是外部命令,所以他会启动子进程然后运行,所以一些局部变量就不起作用。
也就是说设置环境变量的时候我们使用source或者说. 空格可以直接生效。
脚本编写
使用shell脚本文件,必须在第一行指明所使用的shell版本
#!/bin/bash
表示使用的是bash shell
#!/bin/bashdate
# 打印字符串
echo "let's go"
# 将下一行打印到当前行连到一起
echo -n "let's go at:"
date
# 打印环境变量,两种均可
echo "HOME: $HOME"
echo "user: ${USER}"# 用户自定义变量,只在本脚本中生效
var1=10
echo "var1= $var1"
var2=$var1
echo "var2= $var2"# 将shell的输出赋值给变量
var_date=`date`
echo "$var_date"
判断 和循环
# if后面的命令执行成功返回0,则可以进入then
if date
thenecho "date works"
elseecho "date not work"
fi
# if后面只能跟命令,如果要进行条件判断则需要加大括号
if [ 1 -eq 2 ]
thenecho "1 = 2"
elseecho "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
doecho "$var2 test"var2=$[ $var2-1 ]
done# for var in list 读取列表
for i in Ala Alb Alc
doecho "test: $i"
donelist="Ala Alb Alc"
if date
thenecho "date works"
elseecho "date not work"
fi
# if后面只能跟命令,如果要进行条件判断则需要加大括号
if [ 1 -eq 2 ]
thenecho "1 = 2"
elseecho "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
doecho "$var2 test"var2=$[ $var2-1 ]
done# for var in list 读取列表
for i in Ala Alb Alc
doecho "test: $i"
donelist="Ala Alb Alc"
for i in $list
doecho "test: $i"
done# for in c style
for ((i=1; i<10; i++))
doecho "for in c $i"
done
# for遍历目录
for file in /home/*
doif [ -d "$file" ]thenecho "$file is a dir"elif [ -f "$file" ]thenecho "$file is a file"fi
done
命令行参数
传入参数
对传入参数检查,如果缺少参数会产生很糟糕的结果
# args
echo $0 #./1.sh 不单单是程序名称
echo $1
if [ -n "$2" ] # 如果有参数2
# if [ -z "$2" ] 如果没有参数2
thenecho $2
elseecho no args 2
fi
循环读取命令行参数
#当前进程pid
# $$
#统计参数个数
echo "param count $#" for param in "$*"
doecho "Parameter * = $param"
done
for param in "$@"
doecho "Parameter @ = $param"
done
./1.sh a b c d
param count 4
Parameter * = a b c d
Parameter @ = a
Parameter @ = b
Parameter @ = c
Parameter @ = d
获取用户输入
当执行脚本到后,还可以使用read在脚本运行中获取用户输入以做下一步判断。
处理选项
处理简单选项
遍历所有选项,选择符合条件的
while [ -n "$1" ] #循环检测第一个参数,如果第一个参数存在则进入循环
docase "$1" in-a) echo "found the -a option";; # 双引号为语法-b) echo "found the -b option";;-c) echo "found the -c option";;*) echo "no matching option";; # 默认序列esac # case结束符shift # 将参数左移一个位置
done
(base) [user1@sysqa-h3c-b10 ~]$ ./1.sh -b -c -d -a
found the -b option
found the -c option
no matching option
found the -a option
处理带值选项
脚本检测选项中附加的参数,然后进行处理
while [ -n "$1" ] #循环检测第一个参数,如果第一个参数存在则进入循环
#while [ $# -gt 0 ] # 也可以使用这个判断,如果参数个数非0
docase "$1" in-a) echo "found the -a option";; # 双引号为语法-b) param="$2"echo "found the -b option, param=$param"shift;; #因为加了个参数所以要移一位-c) echo "found the -c option";;--) shift #发现破折号,则选项列表结束,脚本将剩余参数作为参数而不是选项处理break;; #退出循环去处理剩余参数*) echo "no matching option";; # 默认序列esac # case结束符shift # 将参数左移一个位置
done
(base) [user1@sysqa-h3c-b10 ~]$ ./1.sh -a -b 4 -d -c
found the -a option
found the -b option, param=4
no matching option
found the -c option
#!/bin/bash # 定义长短选项
while [[ $# -gt 0 ]]; do case "$1" in -h|--help) echo "Usage: $0 [-o|--output=FILE] [-v|--verbose] [file...]" echo " -o, --output=FILE Specify output file" echo " -v, --verbose Enable verbose mode" echo " -h, --help Display this help message" exit 0 ;; -o|--output) shift # 跳过选项本身 output_file="$1" shift # 跳过值 ;; -v|--verbose) verbose_flag=true ;; --) # 结束选项解析 shift break ;; *) # 未知选项 echo "Error: Unknown option $1" exit 1 ;; esac shift # 跳过当前参数
done # 检查是否提供了至少一个非选项参数
if [ $# -eq 0 ]; then echo "Error: No input files provided." echo "Usage: $0 [-o|--output=FILE] [-v|--verbose] [file...]" exit 1
fi # 处理非选项参数(这里简单打印出来)
echo "Processing files:"
for file in "$@"; do echo " $file" # 在这里可以添加处理文件的代码,例如使用cat, grep, sed等命令
done # 根据选项执行相应的操作
if [ -n "$output_file" ]; then echo "Output file specified: $output_file" # 在这里可以添加将处理结果写入文件的代码
fi if $verbose_flag; then echo "Verbose mode is enabled." # 在这里可以添加冗余输出的代码
fi # 脚本结束
exit 0
重定向
标准输入是键盘
输入重定向符号为 < ,也就是输入不再从键盘,而是从其他地方比如文件
标准输出是显示器
输出重定向符号为 >, 也就是输出不再到显示器二十到其他地方比如文件
使用 >> 重定向输出追加
标准错误输出
shell是将错误消息与正常输出分开处理,所以如果发生错误,还是会输出到屏幕
ls badfile 2> a.txt
可以将标准错误输出到文件
数据和错误同时输出到一个文件
ls badfile &> a.txt
或者 2&>1
数据和错误分别输出
ls badfile 1> a.txt 2>b.txt
如果想把一个命令的输出作为另一个命令的输入,可以使用重定向
date > 1.log
sort < 1.log
但是需要两条命令, 看起来有点笨拙。
使用管道符则可以直接完成这个功能
date | sort
显示并且同时输出到文件
tee命令
date | tee 1.txt
如果希望追加则加 -a
替换目录下的所有文件中某个关键字
#!/bin/bash
# find path and replace all .c file keywords is "while" to "for"
find ./ -name "*.c" -exec sed -i 's/hip/mc/g' {} \;
删除关键字所在行
find ./ -name "*.c" -exec sed -i '/load_json_helper/d' {} \;
相关文章:

shell脚本编译与解析
文章目录 shell变量全局变量(环境变量)局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...
第64讲个人中心用户操作菜单实现
静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...
线性代数的本质——1 向量
向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…...

工业以太网交换机引领现代工厂自动化新潮流
随着科技的飞速发展,现代工厂正迎来一场前所未有的自动化变革,而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成,探讨这一集成如何推动工业生产的智能化、效率提升以及未…...

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理
通过“添加自定义菜单”来学习menuconfig图形化配置原理,将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”,此配置项处于菜单“My test m…...

推荐高端资源素材图库下载平台整站源码
推荐高端图库素材下载站的响应式模板和完整的整站源码,适用于娱乐网资源网。该模板支持移动端,并集成了支付宝接口。 演示地 址 : runruncode.com/tupiao/19692.html 页面设计精美,不亚于大型网站的美工水准,并且用户…...
Redis实现:每个进程每30秒执行一次任务
前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由
文章目录 前言一、RWKV-Runner是什么?RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示:这里可以添加本文要记录的大概内容: ChatGPT的横空出世,打开了AI的大门ÿ…...
Dockerfile和.gitlab-ci.yml文件模板
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum,也就是Linux系统的应用商店 Linux--基础开…...

Learn LaTeX 017 - LaTex Multicolumn 分栏
在科学排版中进行分栏操作,能够有效的利用页面中的空间,避免空白位置的浪费。 好的分栏设计能对你的排版增色不少! https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...
Android 9.0 禁用adb install 安装app功能
1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...

华为第二批难题五:AI技术提升六面体网格生成自动化问题
有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…...

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )
文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…...

vscode开发FPGA(0)--windows平台搭建
一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese(simplified)中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…...

Java String源码剖析+面试题整理
由于字符串操作是计算机程序中最常见的操作之一,在面试中也是经常出现。本文从基本用法出发逐步深入剖析String的结构和性质,并结合面试题来帮助理解。 String基本用法 在Java中String的创建可以直接像基本类型一样定义,也可以new一个 Str…...

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战
开篇部分:人工智能、深度神经网络与内存计算的交汇 在当今数字化时代,人工智能(AI)已经成为科技领域的一股强大力量,而深度神经网络(DNN)则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…...

[C/C++] -- CMake使用
CMake(Cross-platform Make)是一个开源的跨平台构建工具,用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程,使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…...
笔记本选购配置参数详解
笔记本电脑的选购是一个技术活,涉及到众多的配置参数。本文将为您详细解析笔记本电脑的主要配置参数,帮助您在选购时做出明智的决策。 1. 处理器(CPU) 处理器是笔记本电脑的核心组件,负责执行计算任务…...
临睡之际的生死思索与生命哲学的启示
在人类生存体验中,有一种独特而深邃的感受——当人们准备进入梦乡时,会担忧第二天醒来是否还能感知到生命的律动。这种“入睡即未知”的心理状态,既是生命无常的深刻体现,也是对个体生命价值、生活态度及人生哲学的一种深度拷问。…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...