在Udig軟件的啟動腳本中使用了while循環、if語句、for循環,其他內容基本都是變量的定義,所以嘗試弄懂腳本中這三部分內容,了解腳本執行過程。
(1)while循環
while do循環內容如下所示,在循環中還用了expr
命令和正則表達式等內容,解析符號鏈接來找到程序的實際路徑。符號鏈接(Symbolic Link),也稱為軟鏈接(Soft Link),是一種特殊的文件類型,它指向另一個文件或目錄,類似于Windows系統中的快捷方式。
while [ -h "$PRG" ]; dols=`ls -ld "$PRG"`link=`expr "$ls" : '.*-> \(.*\)$'`if expr "$link" : '/.*' > /dev/null; thenPRG="$link"elsePRG=`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; thenPRG="$link"elsePRG=`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 $@
doif [ $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