0

我收到一个奇怪的错误,似乎无法弄清楚为什么。

特别是因为它在一个地方有效,但在另一种情况下无效。

我有他的代码来检查这些目录是否存在-并且带有 ~ 的 HOME 目录在此代码段中失败:

if [[ ! -d "$valueToTest" ]]; then
    echo 'Failed>>:'$valueToTest;
fi;

我得到输出:

Failed>>:~/.workspace/
Failed>>:~/.ssh
Failed>>:~/.workspace/vim/temp
Failed>>:~/.workspace/vim/backup
Failed>>:~/.workspace/vim
Failed>>:~/test

就像我说的那样,它只发生在 ~ 扩展来代表我的 HOME 目录。

这是唯一发生这种情况的地方,因为我有其他代码检查路径 ~ 即我的 HOME 目录 ~ 扩展,它们工作正常!

目录是从关联数组的值部分读取的 - 但我不明白为什么会出现问题。您还可以看到输出没有引号或与之相关的引号。

我尝试过使用和不使用双引号 - 没有运气。

如:

$valueToTest
${valueToTest}
"${valueToTest}"

谢谢你的帮助。

4

1 回答 1

0

~以任何方式引用时都不会发生波浪号扩展。路径名或文件名扩展不同,~当它是变量的一部分时也不会扩展。

如果$valueToTest~/.workspace/,所有这些形式都不起作用:

[[ ! -d "$valueToTest" ]]
[[ ! -d $valueToTest ]]
[ ! -d $valueToTest ]

并且只是同义词:

test ! -d '~/.workspace/'

但这会起作用:

test ! -d ~/.workspace/

或者

test ! -d /home/user/.workspace/

因此,对您的代码的修复是,您应该将扩展路径分配给您的变量,而不是未扩展的形式:

valueToTest=~/.workspace/    ## Correct assignment.
valueToTest=~'/.workspace/'  ## Correct assignment.
valueToTest=~"/.workspace/"  ## Correct assignment.

valueToTest='~/.workspace/'  ## Incorrect assignment.
valueToTest="~/.workspace/"  ## Incorrect assignment.

set -- ~/.workspace/         ## Correct assignment.
valueToTest=$1               ## (simulates bash script.sh ~/.workspace/)

set -- "~/.workspace/"       ## Incorrect assignment.
valueToTest=$1

黑客

如果只能存储未展开的形式是不可避免的,您可以使用printf %qandeval来展开您的字符串。到目前为止,我发现足够好且安全:

printf -v temp %q "$valueToTest"
eval "valueToTest=$temp"

然后测试$valueToTest你的做法。

更新

在 Bash 4.3 中,printf %q也已经引用了波浪号字符 ( ~)。要解决此问题,您可以再次取消引用这些字符:

printf -v temp %q "$valueToTest"
temp=${temp//\\\~/\~}
eval "valueToTest=$temp"

您还可以允许$HOME扩展:

printf -v temp %q "$valueToTest"
temp=${temp//\\\~/\~}
temp=${temp//\\\$HOME/\$HOME}
eval "valueToTest=$temp"

另一个可能的解决方法是直接转换它们:

valueToTest=${valueToTest//\~/$HOME}
valueToTest=${valueToTest//\$HOME/$HOME}
于 2014-08-27T09:38:52.867 回答