回答:
-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