确定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程序中的相对路径还是绝对路径的主要内容,如果未能解决你的问题,请参考以下文章