确定在shell程序中使用的是相对路径还是绝对路径

28

如标题所述,我需要确定当程序运行时路径是相对路径还是绝对路径:

./program #relative
dir/dir2/program #relative
~User/dir/dir2/program #absolute
/home/User/dir/dir2/program #absolute

这是我的测试用例。我该如何在 shell 程序中实现这个功能?

更一般地说,如何检查一个路径(在这种情况下是 $0)是相对路径还是绝对路径?


4
shell 在运行脚本之前会解析 ~,因此您只需检查是否存在前导 / - user123444555621
更新:抱歉,我检查了最初的问题,它是关于'${0}'的,所以这不适用于波浪号。 - loshad vtapkah
如果您引用表达式,则意味着字面上是目录./〜User中的相对路径 - 如果这不是您的意思,则引用完全是一个红鲱。 - tripleee
4个回答

32
if [[ "$0" = /* ]]
then
   : # Absolute path
else
   : # Relative path
fi

为什么要使用 [[ ]]? - Dragos Rizescu
1
@DragosRizescu - 使用 [,我必须转义星号。使用 ((,星号将完全停止工作。关键是,您不想将星号与根目录中恰好存在的文件匹配;您想将其与等于运算符的另一个参数匹配。 - Jirka Hanika
对于zsh,单个等号“=”不起作用。我必须使用[[ "$0" == /* ]]。 - pawcik
@pawcik - 显然,原帖作者和我自己都是Bash用户。与Bourne shell和Bash不同,csh、zsh和其他一些Shell使用双等号(==)进行比较,因为单等号被赋值操作符占用。这个问题可能需要一个更具体的标签。 - Jirka Hanika

21

通用解决方案适用于任何$path,而不仅仅是$0

POSIX一行命令

[ "$path" != "${path#/}" ] && echo "absolute" || echo "relative"

7
case "$directory" in
   /*)
      echo "absolute"
      ;;
   *)
      echo "relative"
      ;;
esac

-2
if [ ${path:0:1} == / ]
then
     echo Absolute path
else
     echo Non-absolute path
fi

请使用[编辑]链接格式化此代码并解释其工作原理,不要只给出代码,因为解释更有可能帮助未来的读者。另请参见[答案]。来源 - Jed Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接