当前位置: 首页 > article >正文

linux笔记:shell中的while、if、for语句

在Udig软件的启动脚本中使用了while循环if语句for循环,其他内容基本都是变量的定义,所以尝试弄懂脚本中这三部分内容,了解脚本执行过程。

(1)while循环

while do循环内容如下所示,在循环中还用了expr命令和正则表达式等内容,解析符号链接来找到程序的实际路径。符号链接(Symbolic Link),也称为软链接(Soft Link),是一种特殊的文件类型,它指向另一个文件或目录,类似于Windows系统中的快捷方式。

while [ -h "$PRG" ]; do
	ls=`ls -ld "$PRG"`
	link=`expr "$ls" : '.*-> \(.*\)$'`
	if expr "$link" : '/.*' > /dev/null; then
		PRG="$link"
	else
		PRG=`dirname "$PRG"`/"$link"
	fi
done

while do循环的基本结构如下所示,可以看到与python 直接简单的 while 条件: 循环体内命令 这种结构还是有一些差别。上面代码中,条件是指 -h "$PRG",这个指令用于判断变量$PRG所指向的文件是否是一个符号链接,其中**-h是一个测试运算符,专门用于检查文件是否为符号链接。这里使用了测试条件表达式**,在之后进行测试条件表达式的学习。

while [ 条件 ]; 
do
    # 循环体内的命令
done

循环体内循环了大量的命令,使用ls -ld命令列出了$PRG的详细信息,-d表示只列出$PRG本身的信息,而不是其内容;第二句使用expr命令结合正则表达式$ls中提取符号链接指向的目标路径。正则表达式'.*-> \(.*\)$'的含义是:匹配以 -> 结尾的字符串,并提取其后面的部分,即符号链接的目标路径,然后将其赋值给变量link。这里使用了正则表达式,在之后进行正则表达式的学习。

	ls=`ls -ld "$PRG"`
	link=`expr "$ls" : '.*-> \(.*\)$'`
	if expr "$link" : '/.*' > /dev/null; then
		PRG="$link"
	else
		PRG=`dirname "$PRG"`/"$link"
	fi

在循环中还嵌套另一个if判断语句。上面的第三句代码判断$link是否是一个绝对路径,其中expr "$link" : '/.*'会尝试匹配以/开头的字符串,如果匹配成功,说明$link是一个绝对路径。> /dev/null的作用是将expr命令的输出重定向到/dev/null,因为只关心匹配是否成功,而不关心输出内容。在 Linux 系统中,/dev/null 是一个特殊的文件,它没有任何数据,起着丢弃数据的作用,用于一些忽略输出或者输入的场合。 如果$link是一个绝对路径,就直接将$link赋值给$PRG,这样$PRG就更新为符号链接的实际目标路径。否则的话,dirname "$PRG"会获取$PRG所在的目录路径,然后将其与$link拼接起来,得到完整的绝对路径,并赋值给`$PRG。

(2)for循环

for循环语句遍历命令行参数,并检查其中是否有-data参数。如果有,则将变量DATA_ARG设置为true。这里的$@是一个特殊变量,它包含了脚本接收到的所有命令行参数,而每个参数会被当作一个单独的元素,依次赋值给变量ARG。这里的for循环内部又嵌套了一个if语句,用于检查当前的参数$ARG是否等于-data。其中,**[ $ARG = "-data" ]是一个测试条件表达式,用于比较$ARG和字符串-data是否相等,使用了=运算符进行字符串比较;而then DATA_ARG=true; fi**表示如果$ARG等于-data,则将变量DATA_ARG设置为true

for ARG in $@ 
do
	if [ $ARG = "-data" ]; then DATA_ARG=true; fi
done

for循环的基本结构如下所示:

for 变量 in 值1 值n
do
    # 命令
done

(3)if语句

if语句内容如下所示,其用来根据变量$DATA_ARG的值来决定执行不同的命令。第一句是用来检查变量$DATA_ARG的值,如果$DATA_ARG的值是一个非空字符串且真值,则条件为真,执行then部分的代码;如果$DATA_ARG的值为空字符串或被视为假值,则条件为假,执行else部分的代码。then部分的代码中,$PRGDIR是一个变量,表示程序所在的目录路径;$UDIGEXEC也是一个变量,表示要执行的程序名称,这两个变量组合起来形成完整的命令路径;**$@接收到的所有命令行参数会传递给$PRGDIR/$UDIGEXEC命令。else部分代码中,添加了-data ~/uDigWorkspace**传递给命令的一个额外参数,表示指定数据目录为~/uDigWorkspace

if $DATA_ARG; then 
	$PRGDIR/$UDIGEXEC $@
else
	$PRGDIR/$UDIGEXEC -data ~/uDigWorkspace $@
fi

if 循环的基本结构如下所示:

if 条件
then
    # 命令1
else
    # 命令2
fi

http://www.kler.cn/a/549828.html

相关文章:

  • 开源项目Perplexica-master
  • 对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端
  • Shell脚本和Python的工作路径
  • Linux自学day20-流的输入与输出
  • iPhone 智能进化:Siri 调用 DeepSeek 大模型
  • 二.国产化系统—银河麒麟系统网络无法访问/无法使用/网络受限
  • 高等代数笔记—欧几里得空间、双线性函数
  • JavaScript 中处理 object 对象类型的常见方法
  • 支持列表拖拽嵌套,AI流式输出的多模态文档编辑器flowmix/docx: 全面升级
  • 《图解设计模式》笔记(十)用类来表现
  • 从2025年起:数字化建站PHP 8.1应成为建站开发的基准线
  • 解锁网络安全:穿越数字世界的防护密码
  • GPU(Graphics Processing Unit)详解
  • 图论- 经典最小生成树算法
  • 用xml配置spring, bean标签有哪些属性?
  • 深度解析HTTP/HTTPS协议:从原理到实践
  • 多模态基础模型训练笔记-第一篇InternVL-g
  • vSamOut
  • APIPark 新增 AI模型负载均衡,APIKey 资源池以及 AI Token 消耗统计等重磅功能!
  • day09_实时类标签/指标