shell高級技巧-用腳本完成which命令的基本功能

我們經常會在腳本中調用其他的應用程序,爲了保證腳本具有更好的健壯性,以及錯誤提示的準確性,我們可能需要在執行前驗證該命令是否存在,或者說是否可以被執行。這首先要確認該命令是否位於PATH變量包含的目錄中,再有就是該文件是否爲可執行文件。
      [root@xieqichao ~]# cat > test14.sh
      #!/bin/sh
      #1. 該函數用於判斷參數1中的命令是否位於參數2所包含的目錄列表中。需要說明的是,函數裏面的$1和$2是指函數的參數,而不是腳本的參數,後面也是如此。
      #2. cmd=$1和path=$2,將參數賦給有意義的變量名,是一個很好的習慣。
      #3. 由於PATH環境變量中,目錄之間的分隔符是冒號,因此這裏需要臨時將IFS設置爲冒號,函數結束後再還原。
      #4. 在for循環中,逐個變量目錄列表中的目錄,以判斷該命令是否存在,且爲可執行程序。
      isInPath() {
          cmd=$1        path=$2      result=1
          oldIFS=$IFS   IFS=":"
          for dir in $path
          do
              if [ -x $dir/$cmd ]; then
                  result=0
              fi
          done
          IFS=oldifs
          return $result
      }
      #5. 檢查命令是否存在的主功能函數,先判斷是否爲絕對路徑,即$var變量的第一個字符是否爲/,如果是,再判斷它是否有可執行權限。
      #6. 如果不是絕對路徑,通過isInPath函數判斷是否該命令在PATH環境變量指定的目錄中。
      checkCommand() {
          var=$1
          if [ ! -z "$var" ]; then
              if [ "${var:0:1}" = "/" ]; then
                  if [ ! -x $var ]; then
                      return 1
                  fi
              elif ! isInPath $var $PATH ; then
                  return 2
              fi
          fi
      }
      #7. 腳本參數的合法性驗證。
      if [ $# -ne 1 ]; then
          echo "Usage: $0 command" >&2;
      fi
      #8. 根據返回值打印不同的信息。我們可以在這裏根據我們的需求完成不同的工作。
      checkCommand $1
      case $? in
      0) echo "$1 found in PATH." ;;
      1) echo "$1 not found or not executable." ;;
      2) echo "$1 not found in PATH." ;;
      esac
      exit 0
      CTRL+D
      [root@xieqichao ~]# ./test14.sh echo
      echo found in PATH.
      [root@xieqichao ~]# ./test14.sh MyTest
      MyTest not found in PATH.
      [root@xieqichao ~]# ./test14.sh /bin/MyTest
      /bin/MyTest not found or not executable.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章