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 将变量修改为数组类型

启动文件

  1. 在系统的启动shell中会启动/etc/profile 一旦启动shell就会执行该文件中的命令
  2. HOME目录下的启动文件。在启用一个新shell时会用到下面的启动文件
    ls -a home目录可以看到
    ./bashrc ubuntu的home目录启动文件
环境变量持久化

所以./bashrc文件的作用就是我们可以将要使用的全局环境变量放到这个文件中,那么我们一旦开启新的shell则自动拥有这个环境变量

如果不想重启立即生效,则执行source ~/.bashrc

./和. 的区别

  1. 点空格斜杠执行脚本,是相当于source 执行脚本,也就是说在当前进程中执行命令,所以其中所有变量的设置会对当前Shell其作用

  2. 点斜杠执行脚本是外部命令,所以他会启动子进程然后运行,所以一些局部变量就不起作用。

也就是说设置环境变量的时候我们使用source或者说. 空格可以直接生效。

脚本编写

使用shell脚本文件,必须在第一行指明所使用的shell版本
#!/bin/bash
表示使用的是bash shell

#!/bin/bash

date
# 打印字符串
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"

重定向

输出重定向到文件
date > test1.txt 覆盖
date >> test1.txt 追加

如果想把一个命令的输出作为另一个命令的输入,可以使用重定向
date > 1.log
sort < 1.log

但是需要两条命令, 看起来有点笨拙。
使用管道符则可以直接完成这个功能
date | sort

判断 和循环

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


# if后面的命令执行成功返回0,则可以进入then
if date
then
        echo "date works"
else
        echo "date not work"
fi
# if后面只能跟命令,如果要进行条件判断则需要加大括号
if [ 1 -eq 2 ]
then
        echo "1 = 2"
else
        echo "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
do
        echo "$var2 test"
        var2=$[ $var2-1 ]
done

# for var in list 读取列表
for i in Ala Alb Alc
do
        echo "test: $i"
done

list="Ala Alb Alc"
if date
then
        echo "date works"
else
        echo "date not work"
fi
# if后面只能跟命令,如果要进行条件判断则需要加大括号
if [ 1 -eq 2 ]
then
        echo "1 = 2"
else
        echo "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
do
        echo "$var2 test"
        var2=$[ $var2-1 ]
done

# for var in list 读取列表
for i in Ala Alb Alc
do
        echo "test: $i"
done

list="Ala Alb Alc"
for i in $list
do
        echo "test: $i"
done

# for in c style
for ((i=1; i<10; i++))
do
        echo "for in c $i"
done
# for遍历目录
for file in /home/*
do
        if [ -d "$file" ]
        then
                echo "$file is a dir"
        elif [ -f "$file" ]
        then
                echo "$file is a file"
        fi
done

命令行参数

传入参数

对传入参数检查,如果缺少参数会产生很糟糕的结果

# args
echo $0  #./1.sh 不单单是程序名称
echo $1
if [ -n "$2" ] # 如果有参数2
# if [ -z "$2" ] 如果没有参数2
then
        echo $2
else
        echo no args 2
fi
循环读取命令行参数
#当前进程pid
# $$
#统计参数个数
echo "param count $#" 

for param in "$*"
do
        echo "Parameter * = $param"
done
for param in "$@"
do
        echo "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" ] #循环检测第一个参数,如果第一个参数存在则进入循环
do
        case "$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
do
        case "$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
数据和错误分别输出
ls badfile 1> a.txt 2>b.txt

显示并且同时输出到文件

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' {} \;

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

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

相关文章

【开源】基于JAVA+Vue+SpringBoot的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

为什么说 2023 年是 AI 视频生成的突破年?2024 年的 AI 视频生成有哪些值得期待的地方?

Diffusion Models视频生成-博客汇总 前言&#xff1a;2023年是 AI 视频生成的突破年&#xff0c;AI视频已经达到GPT-2级别了。去年我们取得了长足的进步&#xff0c;但距离普通消费者每天使用这些产品还有很长的路要走。视频的“ChatGPT时刻”何时到来&#xff1f; 目录 前言 …

计算机网络——06分组延时、丢失和吞吐量

分组延时、丢失和吞吐量 分组丢失和延时是怎样发生的 在路由器缓冲区的分组队列 分组到达链路的速率超过了链路输出的能力分组等待排到队头、被传输 延时原因&#xff1a; 当当前链路有别的分组进行传输&#xff0c;分组没有到达队首&#xff0c;就会进行排队&#xff0c;从…

SHA-512在Go中的实战应用: 性能优化和安全最佳实践

SHA-512在Go中的实战应用: 性能优化和安全最佳实践 简介深入理解SHA-512算法SHA-512的工作原理安全性分析SHA-512与SHA-256的比较结论 实际案例分析数据完整性验证用户密码存储数字签名总结 性能优化技巧1. 利用并发处理2. 避免不必要的内存分配3. 适当的数据块大小总结 与其他…

【JavaEE】_传输层协议UDP与TCP

目录 1. 开发中常见的数据组织格式 1.1 XML 1.2 JSON 1.3 Protobuf 2. 端口号 3. UDP协议 4. TCP协议 4.1 特点 4.2 TCP报文格式 4.3 TCP可靠性机制 4.3.1 确认应答机制 4.3.2 超时重传机制 4.3.2.1 丢包的两种情况 4.3.2.2 重传时间 4.3.3 连接管理机制 4.3.3…

分享88个文字特效,总有一款适合您

分享88个文字特效&#xff0c;总有一款适合您 88个文字特效下载链接&#xff1a;https://pan.baidu.com/s/1Y0JCf4vLyxIJR6lfT9VHvg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

160基于matlab的负熵和峭度信号的盲分离

基于matlab的负熵和峭度信号的盲分离。基于峭度的FastICA算法的收敛速度要快&#xff0c;迭代次数比基于负熵的FastICA算法少四倍以上。SMSE随信噪比增大两种判据下的FastICA算法都逐渐变小&#xff0c;但是基于峭度的算法的SMSE更小&#xff0c;因此基于峭度的FastICA算法性能…

H12-821_26

26.下列选项中,哪些路由前缀满足下面的IP-Prefix条件? A.20.0.1.0/24 B.20.0.1.0/23 C.20.0.1.0/25 D.20.0.1.0/28 答案&#xff1a;ACD 注释&#xff1a; 前缀列表可以匹配路由前缀和网络掩码。 ip ip-prefix test index 10 permit 20.0.0.0 16 greater-equal 24 less-equal…

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

ZigBee学习——在官方例程实现组网

✨Z-Stack版本&#xff1a;3.0.2 ✨IAR版本&#xff1a;10.10.1 ✨这篇博客是在善学坊BDB组网实验的基础上进行完善&#xff0c;并指出实现的过程中会出现的各种各样的问题&#xff01; 善学坊教程地址&#xff1a; ZigBee3.0 BDB组网实验 文章目录 一、基础工程选择二、可能遇…

Linux笔记之Docker进行镜像备份与迁移

Linux笔记之Docker进行镜像备份与迁移 ——2024-02-11 code review! 文章目录 Linux笔记之Docker进行镜像备份与迁移1. 导出容器文件系统为 tar 归档文件2. 将 tar 归档文件导入为新的 Docker 镜像3. 运行新的 Docker 镜像并创建容器 1. 导出容器文件系统为 tar 归档文件 要导…

【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】

文章目录: 1.清除默认样式 1.1清除内外边距1.2清除列表圆点(项目符号) 3.外边距问题-合并现象4.外边距问题–塌陷问题5.行内元素垂直内外边距6.圆角与盒子阴影 6.1圆角 6.2 盒子模型-阴影(拓展) 综合案例一 产品卡片 综合案例二 新闻列表 1.清除默认样式 在实际设计开发中,要…

OpenCV-36 多边形逼近与凸包

目录 一、多边形的逼近 二、凸包 一、多边形的逼近 findContours后的轮廓信息countours可能过于复杂不平滑&#xff0c;可以用approxPolyDP函数对该多边形曲线做适当近似&#xff0c;这就是轮廓的多边形逼近。 apporxPolyDP就是以多边形去逼近轮廓&#xff0c;采用的是Doug…

带特效喝酒神器小程序源码-多种游戏支持流量主

由多个游戏组合而成,每一个小程序都基本带特效~~ 功能如下 1.小马快跑(支持竞选模式和个人单选模式,PS马是真的在跑哟) 2.彩票智能选号(支持多个彩种选号,快来选你的专属号码吧) 3.整蛊鳄鱼(少了一颗牙自动往酒杯加酒,看你和几杯) 4.真心话大冒险(这个就不多做解释啦) 5.…

【数学建模】【2024年】【第40届】【MCM/ICM】【F题 减少非法野生动物贸易】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem F: Reducing Illegal Wildlife Trade Illegal wildlife trade negatively impacts our environment and threatens global biodiversity. It is estimated to involve up to 26.5 billion US dollars per y…

PyCharm2023.3.2配置conda环境

重点在于Path to conda这一步&#xff0c;需要找到conda.bat这个文件&#xff0c;PyCharm才能识别出现有的conda环境。

分享76个文字特效,总有一款适合您

分享76个文字特效&#xff0c;总有一款适合您 76个文字特效下载链接&#xff1a;https://pan.baidu.com/s/1rIiUdCMQScoRVKhFhXQYpw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

操作系统(14)----文件系统的结构

目录 一.文件系统的层次结构 1.用户接口&#xff1a; 2.文件目录系统&#xff1a; 3.存取控制模块&#xff1a; 4.逻辑文件系统与文件信息缓冲区&#xff1a; 5.物理文件系统&#xff1a; 二.文件系统的全局结构 1.文件系统在外存中的结构 &#xff08;1&#xff09;物…

Linux nohup命令和

参考资料 linux后台运行nohup命令的使用及2>&1字符详解 目录 前期准备一. 基本语法二. 执行时不指定日志文件三. 执行后不想要日志文件四. nohup命令的执行与kill4.1 执行4.2 kill 前期准备 &#x1f4c4;handle_file.sh #!/bin/bashecho "文件复制开始..."…

2.11 运算符

1、选择题 1.1、若有以下程序 main() { char a1,b2; printf("%c,",b); printf("%d\n",b-a); } 程序运行后的输出结果是 C A&#xff09;3,2 B&#xff09;50,2 C&#xff09;2,2 D&#xff09;2,50 解析&#xff1a;b是先赋值后自加&#…