特殊變量:
linux中shell變量$#,$@,$0,$1,$2的含義解釋: 變量說明: $$ Shell本身的PID(ProcessID) $! Shell最后運行的后台Process的PID $? 最后運行的命令的結束代碼(返回值) $- 使用Set命令設定的Flag一覽 $* 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。 $@ 所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。 $# 添加到Shell的參數個數 $0 Shell本身的文件名 $1~$n 添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
整數比較:
-eq 等於,如:if [ "$a" -eq "$b" ] -ne 不等於,如:if [ "$a" -ne "$b" ] -gt 大於,如:if [ "$a" -gt "$b" ] -ge 大於等於,如:if [ "$a" -ge "$b" ] -lt 小於,如:if [ "$a" -lt "$b" ] -le 小於等於,如:if [ "$a" -le "$b" ] < 小於(需要雙括號),如:(("$a" < "$b")) <= 小於等於(需要雙括號),如:(("$a" <= "$b")) > 大於(需要雙括號),如:(("$a" > "$b")) >= 大於等於(需要雙括號),如:(("$a" >= "$b"))
if中其他參數:
-e 文件存在 -a 文件存在(已被棄用) -f 被測文件是一個regular文件(正常文件,非目錄或設備) -s 文件長度不為0 -d 被測對象是目錄 -b 被測對象是塊設備 -c 被測對象是字符設備 -p 被測對象是管道 -h 被測文件是符號連接 -L 被測文件是符號連接 -S(大寫) 被測文件是一個socket -t 關聯到一個終端設備的文件描述符。用來檢測腳本的stdin[-t0]或[-t1]是一個終端 -r 文件具有讀權限,針對運行腳本的用戶 -w 文件具有寫權限,針對運行腳本的用戶 -x 文件具有執行權限,針對運行腳本的用戶 -u set-user-id(suid)標志到文件,即普通用戶可以使用的root權限文件,通過chmod +s file實現 -k 設置粘貼位 -O 運行腳本的用戶是文件的所有者 -G 文件的group-id和運行腳本的用戶相同 -N 從文件最后被閱讀到現在,是否被修改 f1 -nt f2 文件f1是否比f2新 f1 -ot f2 文件f1是否比f2舊 f1 -ef f2 文件f1和f2是否硬連接到同一個文件
字符串比較:
= 等於 if [ "$a" = "$b" ] == 與=等價 != 不等於 if [ "$a" = "$b" ] < 小於,在ASCII字母中的順序: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] #需要對<進行轉義 > 大於 -z 字符串為null,即長度為0 -n 字符串不為null,即長度不為0
#如果沒有參數被傳遞到腳本中, 那么就使用 #當前目錄. 否則就是用傳遞進來的參數作為目錄 #來搜索. [ $# -eq 0 ] && directorys=`pwd` || directorys=$@ #編寫函數linkchk用來檢查傳遞進來的目錄或文件是否是鏈接, #並判斷這些文件或目錄是否存在. 然后打印它們所指向的文件. #如果傳遞進來的元素包含子目錄, #那么把子目錄也放到linkcheck函數中處理, 這樣就達到了遞歸的目的. ########## linkchk () { for element in $1/*; do [ -h "$element" -a ! -e "$element" ] && echo \"$element\" [ -d "$element" ] && linkchk $element # 當然, '-h'用來測試符號鏈接, '-d'用來測試目錄. done } #把每個傳遞到腳本的參數都送到linkchk函數中進行處理, #檢查是否有可用目錄. 如果沒有, 那么就打印錯誤消息和 #使用信息. ################ for directory in $directorys; do if [ -d $directory ] then linkchk $directory else echo "$directory is not a directory" echo "Usage: $0 dir1 dir2 ..." fi done exit 0