Linux笔记:了解Shell脚本

embedded/2025/2/19 2:39:35/

我们在windows系统下经常使用cmd来执行命令,包括之前学习的GDAL指令也是基于cmd去执行的。Windows 中的 cmd 是基础命令行工具,而 Windows也提供了PowerShell。与cmd相比,PowerShell 是更强大的命令行环境,它融合了传统命令行的功能和面向对象的脚本能力。但是在Linux中往往使用的其他的shell版本,Ubuntu 通常使用的 Shell 是 Bash(Bourne Again SHell),它是大多数 Linux 发行版的默认 Shell。除了常见的 Bash 外,还有 Zsh、Ksh、Tcsh 等。

我一开始迷惑Liunx和shell关系,后来发现原来大多数linux命令就是shell命令。Linux下的多数命令其实都是基于shell命令进行的,Shell 作为用户与 Linux 操作系统之间的接口,负责接收用户输入的命令并将其解释给内核,使内核执行相应的操作,所以说我们学习的linux命令大多数就是shell命令

Shell是一门语言,除了简单的命令外,也支持for循环、if判断等。此外,很多人都在windows下使用过.bat脚本,而shell也可以构建脚本。在安装Udig后,我们需要使用sh文件启动软件,Udig的启动文件就是一个shell脚本。

linux中,创建一个以 .sh 结尾的文件,并在开头添加 #!/bin/bash ,然后添加要执行的命令,便能创建一个脚本文件。下面是Udig软件的启动脚本,这里能直观看到的是有while do循环定义变量for循环if判断,并且这里是使用#!/bin/sh进行的定义。结合AI对下面代码进行了大体上的注释与学习:

#!/bin/sh
# 定义变量UDIGEXEC,其值为udig_internal,表示要执行的程序名称是位于当前路径下的udig_internal文件
UDIGEXEC=udig_internal
# 将脚本当前的路径赋值给变量PRG
PRG="$0"
# 通过`while`循环和`ls`、`expr`等命令,解析PRG变量所指向的文件是否为符号链接。如果是,则获取其实际指向的文件路径,并更新PRG变量的值,直到PRG变量指向的文件不再是符号链接。
while [ -h "$PRG" ]; dols=`ls -ld "$PRG"`link=`expr "$ls" : '.*-> \(.*\)$'`if expr "$link" : '/.*' > /dev/null; thenPRG="$link"elsePRG=`dirname "$PRG"`/"$link"fi
done
# 设置GTK_NATIVE_WINDOWS环境变量为1
export GTK_NATIVE_WINDOWS=1# 获取PRG变量所指向文件的目录路径,并赋值给PRGDIR
PRGDIR=`dirname "$PRG"`
# 获取当前工作目录的路径,并赋值给PWD
PWD=`pwd`
# 设置GDAL_DATA环境变量为PRGDIR/gdal_data,并输出该变量的值
export GDAL_DATA="$PRGDIR/gdal_data"
# 打印GDAL_DATA环境变量
echo GDAL_DATA $GDAL_DATA# Get standard environment variables
DATA_ARG=false
# 通过`for`循环遍历脚本接收到的所有命令行参数 $@ 
for ARG in $@ 
do
# 判断每个参数是否等于`-data`,如果等于,则将DATA_ARG变量设置为trueif [ $ARG = "-data" ]; then DATA_ARG=true; fi
done
# 若DATA_ARG为true,即命令行参数中包含`-data`,则直接执行`$PRGDIR/$UDIGEXEC $@`,并将所有命令行参数传递给它
# 若DATA_ARG为false,命令行参数中不包含`-data`,则执行`$PRGDIR/$UDIGEXEC -data ~/uDigWorkspace $@`,即在PRGDIR目录下执行udig_internal程序,添加`-data ~/uDigWorkspace`参数,并将其他命令行参数传递给它。
if $DATA_ARG; then $PRGDIR/$UDIGEXEC $@
else$PRGDIR/$UDIGEXEC -data ~/uDigWorkspace $@
fi

脚本的总体流程便是:先解析脚本路径,然后设置环境变量,再处理命令行参数,最后执行udig_internal程序。若想具体了解脚本执行过程,还需要深入了解脚本的内容。


http://www.ppmy.cn/embedded/163387.html

相关文章

相机与激光雷达联合标定综述

参考还在为“相机-激光雷达”联合标定烦恼吗?这两种自动化标定方法助你解惑

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_create_pool函数

ngx_create_pool 声明在 src\core\ngx_palloc.h 中 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); 实现在 src\core\ngx_palloc.c 中 ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p ngx_memalign(NGX_POOL_ALIGNMENT, size, lo…

采用分布式部署deepseek

分布式部署DeepSeek涉及使用多个计算节点来加速模型训练或提升推理效率。下面是一个基本的指南,帮助您了解如何进行分布式部署。 1. 环境准备 硬件需求:确保您的集群环境中有足够的GPU资源,并且所有机器之间可以通过高速网络互联。软件依赖…

Leetcode Hot100 第30题 416.分割等和子集

class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int num:nums){sumnum;}if(sum%21) return false;int bag_size sum/2;// return dfs(nums,nums.size()-1,bag_size);//递归做法vector<vector<bool>> dp(nums.size()1,vec…

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言&#xff1a;本篇文章解释了接口学习过程中的2个常见问题&#xff0c;一个是“为什么是类在使用接口”&#xff0c;另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”&#xff0c;旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…

MATLAB图像处理:Sobel、Roberts、Canny等边缘检测算子

边缘是图像中像素值剧烈变化的区域&#xff0c;反映了目标的轮廓、纹理等关键信息。边缘检测是图像分割、目标识别等任务的基础。本文将系统解析 六种经典边缘检测算子 的数学原理、实现方法及适用场景&#xff0c;并给出完整的MATLAB代码示例和对比分析。 1. 边缘检测基础 1…

【第2章:神经网络基础与实现——2.1 前馈神经网络的结构与工作原理】

老铁们好!今天我们要来一场长达两万字的超详细技术探险,我会像拆解乐高积木一样把前馈神经网络(Feedforward Neural Network)的每个零件摆在台面上,用最接地气的方式让你彻底搞懂这个深度学习基石的工作原理。准备好了吗?我们开始吧! 第一章:神经网络的 “乐高积木” 1…