相対パスから絶対パスを得る

相対パス絶対パスに変換する一般的な方法は用意されていない
相対パスの前にカレントディレクトリを付け足し.や..を処理することで
絶対パスに変換しています。

#!/bin/sh
#relpath2abs.sh

if [ -z "$1" ]; then
    echo "Usage: reopath2abs.sh path"
    exit 1
fi

#引数が/で始まっているか調べる
#exprの引数に/1文字を指定すると割り算記号と間違えられて
#エラーになるので、前に余分な文字xを置いている
if [ `expr x"$1" : x'/'` -ne 0 ]; then
    rel="$1"
else
    rel="$PWD/$1"
fi

abs="/"
IFS='/'

#相対パスの要素について繰り返す
for comp in $rel; do
    case "$comp" in
        #/./ // → /
        '.' | '')
            continue
            ;;
        #..の場合絶対パスの最後の要素を取り除く
        '..'    )
            abs=`dirname "$abs"`
            ;;
        #その他の場合要素を絶対パスの最後に追加
        *       )
            [ "$abs" = "/" ] && abs="/$comp" || abs="$abs/$comp"
            ;;
    esac
done
echo "$abs"
$ pwd; ./relpath2abs.sh ../
/home/anmino
/home