我們經常會在腳本中調用其他的應用程序,爲了保證腳本具有更好的健壯性,以及錯誤提示的準確性,我們可能需要在執行前驗證該命令是否存在,或者說是否可以被執行。這首先要確認該命令是否位於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.