回答:
-L
「ファイル」が存在し、シンボリックリンクである場合はtrueを返します(リンクされたファイルが存在する場合と存在しない場合があります)。必要な-f
場合(ファイルが存在し、通常のファイルで-e
ある場合はtrueを返します)または単に(ファイルがタイプに関係なく存在する場合はtrueを返します)。
よるGNUマンページ、-h
と同一である-L
が、それに応じてBSDのマニュアル、それが使用されるべきではありません。
-h file
ファイルが存在し、シンボリックリンクであれば真。この演算子は、このプログラムの以前のバージョンとの互換性のために保持されています。その存在に依存しないでください。代わりに-Lを使用してください。
!
は、角括弧の外側にif ! [ -L $mda ]; then .... fi
感嘆符を付けることです。
if [ ! -L "$mda" ]; then ... fi
(注:if [ ! ... ]
とif ! [ ... ]
同一:)
-Lはファイルが存在するかどうかのテストであり、シンボリックリンクでもあります
ファイルがシンボリックリンクであるかどうかをテストするのではなく、タイプ(ファイル、ディレクトリ、ソケットなど)に関係なく存在するかどうかをテストする場合は、-eを使用します。
したがって、fileが単なるシンボリックリンクではなく実際にfileである場合、これらすべてのテストを実行して、エラー状態を示す値を持つ終了ステータスを取得できます。
if [ ! \( -e "${file}" \) ]
then
echo "%ERROR: file ${file} does not exist!" >&2
exit 1
elif [ ! \( -f "${file}" \) ]
then
echo "%ERROR: ${file} is not a file!" >&2
exit 2
elif [ ! \( -r "${file}" \) ]
then
echo "%ERROR: file ${file} is not readable!" >&2
exit 3
elif [ ! \( -s "${file}" \) ]
then
echo "%ERROR: file ${file} is empty!" >&2
exit 4
fi
-e "${file}"
シンボリックリンクは存在するがそのターゲットが存在しない場合は失敗します。
あなたはシンボリックリンクの存在とそれが壊れていないことをチェックすることができます:
[ -L ${my_link} ] && [ -e ${my_link} ]
したがって、完全なソリューションは次のとおりです。
if [ -L ${my_link} ] ; then
if [ -e ${my_link} ] ; then
echo "Good link"
else
echo "Broken link"
fi
elif [ -e ${my_link} ] ; then
echo "Not a link"
else
echo "Missing"
fi
使用してみreadlink
ませんか?
# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
test "$(readlink "${1}")";
}
FILE=/usr/mda
if simlink? "${FILE}"; then
echo $FILE is a symlink
else
echo $FILE is not a symlink
fi
ファイルは本当にシンボリックリンクですか?そうでない場合、通常の存在テストは-r
または-e
です。
を参照してくださいman test
。
ファイルの存在をテストする場合は、-Lではなく-eを使用します。-Lは、シンボリックリンクをテストします。
最初にこのスタイルで行うことができます:
mda="/usr/mda"
if [ ! -L "${mda}" ]; then
echo "=> File doesn't exist"
fi
より高度なスタイルで実行したい場合は、以下のように記述できます。
#!/bin/bash
mda="$1"
if [ -e "$1" ]; then
if [ ! -L "$1" ]
then
echo "you entry is not symlink"
else
echo "your entry is symlink"
fi
else
echo "=> File doesn't exist"
fi
上記の結果は次のようになります:
root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda
your entry is symlink
root@linux:~# ./sym.sh
=> File doesn't exist