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