bashでディレクトリと相対パスを見つけるために$ 0変数を分割する方法は?

bashでディレクトリと相対パスを見つけるために$ 0変数を分割する方法は?

$ 0変数にはスクリプトのパス情報が含まれています。

  • パス情報を絶対パスに変更するには?私の言葉は〜、.、..、またはこれに似たものを処理する方法を意味しますか?
  • パス情報をディレクトリとファイル名に分割するには?

これを達成するためにpython / perlを使用できますが、可能であればbashを使用したいと思います。

答え1

そのようなことを処理する必要はありません~。シェルが代わりに処理します。これがまさに~/filenameどのスクリプトやプログラムに渡すことができ、機能できるのかです。これらのプログラムはすべて~自分で処理せず、シェルは引数を変換して/home/username/filenameプログラムに渡します。

$ echo ~/filename
/home/mrozekma/filename

標準ファイル名が必要な場合(例..:realpathニール):

$ realpath ~/../filename
/home/filename

パスをディレクトリ名とファイル名に分割するには、dirname次のようにしますbasename

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz

答え2

Michaelが述べたように、ディレクトリ名とデフォルト名を使用することが望むものを得る最も安全な方法です。

とにかく、「bashのみのツール」を使用してこれを行うには、パラメータ置換を使用できます。

echo `basename $PWD`        # Basename of current working directory.
echo "${PWD##*/}"           # Basename of current working directory.
echo
echo `basename $0`          # Name of script.
echo $0                     # Name of script.
echo "${0##*/}"             # Name of script.
echo
filename=test.data
echo "${filename##*.}"      # data
                            # Extension of filename.

この例は、次から直接インポートしたものです。高度なバッシュスクリプトガイド見る価値があります。

説明は簡単です。

${var#Pattern} $var のフロントエンドと一致する $Pattern の最短部分を $var から削除します。 ${var##Pattern} は、$var のフロントエンドと一致する $Pattern の最長部分を $var から削除します。

パターンを正規表現および#/または##貪欲な/非欲張りな修飾子と考えてください。

これは、パス部分をより複雑に抽出する必要がある場合に便利です。

答え3

realpath実際のパスを知らせるコマンド(..やシンボリックリンクの削除など)。

FreeBSD 標準です。この議論によると、Linuxでも動作します。

http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html

ディスカッションでは bash ソリューションも提供します。

$ bash -c "cd /foo/../bar/ ; pwd"

関連情報