我们在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程序。若想具体了解脚本执行过程,还需要深入了解脚本的内容。