今回はShellScript向けのちょっとしたテクニックを発見したので、備忘録と共有を兼ねて紹介します。
用途
かなり限定的な使用用途になりそうですが、カレントディレクトリの中にあるディレクトリ内に存在するファイルのフルパスから、カレントディレクトリから該当ファイルのパスのみを抽出したい時に使用します。
例えばfile.txt
のフルパスが/home/USER/workdir/file.txt
となっている状態で、/workdir/file.txt
の部分のみ必要になった時に、/home/USER
を取り除きたい場合に使用します。
Shell中身
# !/bin/sh
if [ $# != 1 ]; then
echo "引数を1つ指定してください"
exit 1
fi
DIRCNT=`pwd | wc -m`
FILEPASS=`echo $1 | cut -c $DIRCNT-`
echo $FILEPASS
exit 0
上記シェルを/home/USER
の中で作成し、./<シェルスクリプト名> /home/USER/workdir/file.txt
という書式で実行すると、カレントディレクトリ直下のディレクトリ名から対象ファイルまでのパス/workdir/file.txt
が返ってきます。
解説
まず最初のif文については、引数を指定していないか2つ以上指定された場合に処理を中断するためのものです。
次に変数DIRCNT
については、カレントディレクトリまでの文字数を代入しています。wc -m
コマンドは通常テキストファイルの文字数を表示するコマンドですが、コマンド実行結果の文字数を返すこともできます。
これにより例えば/home/USER
の場合は、10文字なので、DIRCNT
の中には10という数値が格納されます。
最後にFILEPASS
変数には、引数として指定された、対象ファイルへのフルパスに対して、cut
コマンドで指定した文字数を削ります。
cut -c
コマンドに指定した引数ですが、指定方法は<先頭文字数>-<終端文字数>
となっており、先程10
を格納した変数DIRCNT
を先頭文字数として指定していますが、終端文字数には何も指定していません。これにより先頭文字数として指定した10文字、すなわち/home/USER
の部分はカットされ、終端文字数を指定していないので、それ以降の文字数(つまり/workdir/file.txt
まで)が表示されるようになります。
今回は1つのファイル分しか表示できないのであまり使いみちはなさそうですが、次回はこれを応用したシェルを紹介しようと思います。