为什么这个bash-e和-L测试没有捕获这个链接?

为什么这个bash-e和-L测试没有捕获这个链接?,bash,Bash,我有一个bash脚本,它是幂等的。它会创建符号链接,如果链接已经存在,应该可以 这是摘录 L="/var/me/foo" if [[ -e "$L" ]] && ! [[ -L "$L" ]]; then echo "$L exists but is not a link." exit 1; elif [[ -e "$L" ]] && [[ -L "$L" ]]; then e

我有一个bash脚本,它是幂等的。它会创建符号链接,如果链接已经存在,应该可以

这是摘录

    L="/var/me/foo"
    if [[ -e "$L" ]] && ! [[ -L "$L" ]];
    then
        echo "$L exists but is not a link."
        exit 1;
    elif [[ -e "$L" ]] && [[ -L "$L" ]];
    then
        echo "$L exists and is a link."
    else
        ln -s "/other/place" "$L" ||
        {
            echo "Could not chown ln -s for $L";
            exit 1;
        }
    fi
根据
ls-l
,文件
/var/me/foo
已经是指向
/other/place
的符号链接

尽管如此,当我运行此脚本时,如果未输入
elif
分支,我们将进入
else
并尝试执行
ln
,该操作失败,因为文件已经存在


为什么我的测试不起作用?

因为你只检查
[-L“$L”]
如果
[-e“$L”]
为真,并且
[-e“$L”]
对于指向不存在的目标的链接返回false,你不会检测到指向不存在的位置的链接

下面的逻辑更全面一些

link=/var/me/foo
dest=/other/place
# because [[ ]] is in use, quotes are not mandatory
if [[ -L $link ]]; then
  echo "$link exists as a link, though its target may or may not exist" >&2
elif [[ -e $link ]]; then
  echo "$link exists but is not a link" >&2
  exit 1
else
  ln -s "$dest" "$link" || { echo "yadda yadda" >&2; exit 1; }
fi

您是否可以创建一个可以在临时目录中运行的示例(或者甚至使用
mktemp-d
自己创建目录),这样人们就可以复制/粘贴并运行它,而无需更改名称或拥有根权限?另外:
/other/place
是否存在?如果应该,请确保您的示例实际创建了它(当然,在您的临时目录下)…此外,如果
-e
为真,为什么只检查
-L
?…作为旁白:所有caps变量名都由对shell或操作系统有意义的变量使用。考虑为您自己的变量使用小写名称,这些变量保留给应用程序使用,以避免错误地重写一些重要的内容。请参阅--谈到环境变量,但这些约定也适用于常规shell变量,因为设置shell变量会覆盖任何类似命名的环境变量。