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

Posted

技术标签:

【中文标题】确定shell程序中的相对路径还是绝对路径【英文标题】:Determine if relative or absolute path in shell program 【发布时间】:2012-07-09 08:51:30 【问题描述】:

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

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

这是我的测试用例。我怎么能在 shell 程序中做这件事呢?

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

【问题讨论】:

shell会在运行脚本之前解析~,所以你只需要检查前导/ @user123444555621 - 仅当它按原样提供时。在 echo "~User" 的情况下,它不会。更新:抱歉,我检查了最初的问题,它是关于“$0”的,所以波浪号不是这种情况。 @loshadvtapkah 如果你引用这个表达式,那么它的意思是 字面意思 目录 ./~User 中的相对路径——如果这不是你的意思,那么引用完全是一个红鲱鱼。 【参考方案1】:
if [[ "$0" = /* ]]
then
   : # Absolute path
else
   : # Relative path
fi

【讨论】:

为什么要放[[ ]]。 @DragosRizescu - 使用[,我将不得不转义星号。使用((,星号将完全停止工作。关键是,您不想将星号与恰好存在于根目录中的文件匹配;您想将其与等号运算符的另一个参数相匹配。 对于 zsh single = 不起作用。我不得不使用 [[ "$0" == /* ]] @pawcik - 显然,OP 和我自己都是 bash 用户。 csh、zsh 和其他一些与 Bourne shell 和 bash 的不同之处在于使用双等号 (==) 进行比较,因为单等号由赋值运算符采用。这个问题可能需要一个更具体的标签。【参考方案2】:
if [ $path:0:1 == / ]
then
     echo Absolute path
else
     echo Non-absolute path
fi

【讨论】:

请使用edit链接来格式化这段代码并解释它是如何工作的,不要只给出代码,因为解释更有可能帮助未来的读者。另见How to Answer。 source【参考方案3】:

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

POSIX 一个内衬

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

【讨论】:

【参考方案4】:
case "$directory" in
   /*)
      echo "absolute"
      ;;
   *)
      echo "relative"
      ;;
esac

【讨论】:

以上是关于确定shell程序中的相对路径还是绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

检测路径是绝对的还是相对的

如何检查路径是绝对路径还是相对路径

Shell脚本怎样转相对路径为绝对路径

如何使用Python以跨平台方式检查路径是绝对路径还是相对路径?

怎么把文件保存到绝对路径

相对路径和绝对路径