當寫 Shell Script 時, 很多時需要取得 Shell Script 本身的目錄位置, 以下教學是在 Shell Script 取得目錄位置的寫法。
在 Shell Script 的 $0 變數代表指令的第一個參數, 即 Shell Script 本身, 例如 Shell Script 是 “/root/test.sh”:
#!/usr/bin/sh
echo $0
執行時會返回:
# /root/test.sh
/root/test.sh
/root/test.sh
所以最簡單的方法是用 dirname, 將 /home/samtang/test.sh 的目錄位置取得, 例如:
1 2 3 4 |
#!/usr/bin/sh BASEDIR=$(dirname "$0") echo "$BASEDIR" |
執行結果會返回:
# /root/test.sh
/root
/root
以上寫法雖然簡單, 但如果用相對路徑執行, 只會返回相對路徑的目錄, 例如:
# cd /root
# ./test.sh
.
# ./test.sh
.
可以看到上面的例子只會返回 “.”, 當然如果執行的 Shell Script 全部用完整的絕對路徑便不用理會, 但如果想要不論用絕對路徑或相對路徑都可以顯示正確, 可以用以下程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/sh get_script_dir () { SOURCE="${BASH_SOURCE[0]}" # While $SOURCE is a symlink, resolve it while [ -h "$SOURCE" ]; do DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" SOURCE="$( readlink "$SOURCE" )" # If $SOURCE was a relative symlink (so no "/" as prefix, need to resolve it relative to the symlink base directory [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" done DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" echo "$DIR" } echo "$(get_script_dir)" |
以上 Shell Script 可以正確顯示絕對路徑或相對路徑的目錄。