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

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

相关文章:

  • Spring 如何解决循环依赖以及那些无法解决的循环依赖
  • 【贝克街迷宫疑云:用侦探思维破解Java迷宫算法】
  • java练习(26)
  • 《open3d pyqt》Alpha重建
  • el-table使用fixed=“right“时固定多列,最左边的左边框不显示
  • C++常用数学函数详解与代码示例
  • C++ ——static关键字
  • ubuntu20.04安装nccl2.16.5
  • 物联网平台建设方案
  • 直线模组在搬运过程中需要注意什么?
  • 网络安全扫描--基础篇
  • Flowith.io 初探:DeepSeek-R1免费用,用画布式 AI 提升效率和创意
  • Deepseek部署-本地windows非系统C盘 -可视化 -4060甜品卡
  • Pikachu靶场-SSRF漏洞
  • DeepSeek视角下学术论文创新点探索干货分享!
  • 详述发票二维码与python解析技术
  • 链表和list
  • 情书网源码 情书大全帝国cms7.5模板
  • Vue 记录用户进入页面的时间、离开页面的时间并计算时长
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑤】
  • 如何做网站的教程视频/收录入口在线提交
  • 做鞋子批发的网站有哪些/东营seo网站推广
  • 线上名片制作/seo外包公司报价
  • 交互网站开发/电商网站开发平台有哪些
  • 手机网站建站价格/泸州网站seo
  • 上饶时时彩网站建设/海南乐秀同城群软件下载