Bash目录比较

Bash目录比较,bash,Bash,我有一个bash脚本,它接受两个参数,一个源目录和一个输出目录。现在我用一个简单的 [ $1 == $2 ] 检查重复的目录,对于定义良好的参数,这些目录可以正常工作。但是,根据bash文件存在的位置以及用户为args输入的内容,它可能并不总是有效,并且会导致很多问题。例如,如果文件位于/opt/script/目录中,则用户无法输入 ./processLogs.sh ./ /opt/script/ 并通过简单检查,即使它们指向同一目录。您可能知道,有很多方法可以导航&使用不同的语法指向目录,

我有一个bash脚本,它接受两个参数,一个源目录和一个输出目录。现在我用一个简单的

[ $1 == $2 ]
检查重复的目录,对于定义良好的参数,这些目录可以正常工作。但是,根据bash文件存在的位置以及用户为args输入的内容,它可能并不总是有效,并且会导致很多问题。例如,如果文件位于
/opt/script/
目录中,则用户无法输入

./processLogs.sh ./ /opt/script/

并通过简单检查,即使它们指向同一目录。您可能知道,有很多方法可以导航&使用不同的语法指向目录,但是有没有方法确保或检查它们是否指向同一个实例

您可以尝试对参数应用
readlink-f

if [[ $(readlink -f "$1") == $(readlink -f "$2") ]] ; then
    echo The arguments are the same. >&2
    exit 1
fi

readlink
将路径转换为其规范表示形式并解析链接。

您可以尝试将
readlink-f
应用于参数:

if [[ $(readlink -f "$1") == $(readlink -f "$2") ]] ; then
    echo The arguments are the same. >&2
    exit 1
fi

readlink
将路径转换为其规范表示形式并解析链接。

您可以使用
realpath

[ "$(realpath "$1")" = "$(realpath "$2")" ]
realpath
打印解析的路径,因此它也适用于
/
之类的事情。最好将变量用双引号括起来,以避免包含空格的变量出现问题


请注意,在使用
[[]]
时,.

可以使用
realpath

[ "$(realpath "$1")" = "$(realpath "$2")" ]
realpath
打印解析的路径,因此它也适用于
/
之类的事情。最好将变量用双引号括起来,以避免包含空格的变量出现问题


请注意,当使用
[[]]
时,.

谢谢Tom,我不知道如何使用realpath。我对bash脚本非常陌生,我所有的脚本都非常简单和小,这可能就是为什么我对[x==y]没有问题,但知道得很好。@user3277223实际上我之前说的不太正确。可以将
==
与单个
[]
一起使用,这只是一个同义词。如果您使用的是bash,您也可以像choroba的回答一样使用
[[[]]
,这是一种更通用(但便携性稍差)的测试。@TomFenech,我实际上会说这不好,因为POSIX没有指定
=
,所以这样做的脚本比不指定的脚本便携性差。(这就是说,
realpath
也不是POSIX标准化的,所以这可能只是一个Linux唯一的答案)。它结合了
[…=…]]
的不可移植性和
[…=…]
的局限性(必须引用所有内容,没有模式匹配,没有合适的布尔运算符等)。引用得到了改进,并重新链接到Freenode#bash channel wiki(比ABS更注重最佳实践)。感谢Tom,我不知道如何使用realpath。我对bash脚本非常陌生,我所有的脚本都非常简单和小,这可能就是为什么我对[x==y]没有问题,但知道得很好。@user3277223实际上我之前说的不太正确。可以将
==
与单个
[]
一起使用,这只是一个同义词。如果您使用的是bash,您也可以像choroba的回答一样使用
[[[]]
,这是一种更通用(但便携性稍差)的测试。@TomFenech,我实际上会说这不好,因为POSIX没有指定
=
,所以这样做的脚本比不指定的脚本便携性差。(这就是说,
realpath
也不是POSIX标准化的,所以这可能只是一个Linux唯一的答案)。它结合了
[…=…]]
的不可移植性和
[…=…]
的局限性(必须引用所有内容,没有模式匹配,没有合适的布尔运算符等)。引用得到了改进,并重新链接到Freenode#bash channel wiki(比ABS更注重最佳实践)。仅供参考,使用名称包含空格或通配符的目录时,需要使用引号:
[“$1”=“$2”]
。您还可以使用bash/ksh/zsh扩展名
[[]]
,如:
[[[$1=$2]]
。请注意,POSIX标准化运算符是
=
,而不是
=
——支持
=
的shell超出了标准,如果您的shebang是
,您不应该假设您的代码所针对的每个shell都会这样做/bin/sh
(保证为POSIX sh,但仅此而已)。错误
[[$1=“$2”]]
,而--
[[[$1=$2]]
$2
的内容视为外壳模式,而不是文字字符串。仅供参考,使用包含空格或通配符的目录时需要引号:
[“$1”=“$2”]
。您还可以使用bash/ksh/zsh扩展名
[[]]
,如:
[[[$1=$2]]
。请注意,POSIX标准化运算符是
=
,而不是
=
——支持
=
的shell超出了标准,如果您的shebang是
,您不应该假设您的代码所针对的每个shell都会这样做/bin/sh
(保证为POSIX sh,但仅此而已)。错误
[[$1=“$2”]]
,而--
[[[$1=$2]]
$2
的内容视为shell模式而不是文本字符串。请注意,
readlink-f
是一个GNUism,并非在所有平台上都可用。否则,请注意,
readlink-f
是一个GNUism,并非在所有平台上都可用。否则,LGTM。