在使用波浪号扩展的HOME目录下测试消极 [英] Getting negative on test for HOME directories with tilde ~ expansion

查看:203
本文介绍了在使用波浪号扩展的HOME目录下测试消极的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



特别是因为它在一个地方工作,而在另一个场景中不起作用。

>

我有他的代码检查这些目录是否存在 -
和与〜的HOME dirs在此代码片段中失败:

 如果[[! -d$ valueToTest]];那么
echo'Failed>>:'$ valueToTest;
fi;

我得到输出:

 失败>>:〜/ .workspace / 
失败>>:〜/ .ssh
失败>>:〜/ .workspace / vim / temp
失败>>:〜/ .workspace / vim / backup
失败>>:〜/ .workspace / vim
失败>>:〜/ test

像我说的那样,只有〜扩展代表我的HOME目录。



这是发生的唯一的地方,因为我有其他代码检查路径〜ie我的HOME目录与〜扩展,他们工作正常!



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



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



如下:

  $ valueToTest 
$ {valueToTest}
$ {valueToTest}

感谢您的帮助。

解决方案

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



如果 $ valueToTest 〜/ .workspace / ,所有这些表单都不起作用:

 code> [[! -d$ valueToTest]] 
[[! -d $ valueToTest]]
[! -d $ valueToTest]

而且只是:

 测试! -d'〜/ .workspace /'

但是这样会有效:

 测试! -d〜/ .workspace / 

 测试! -d /home/user/.workspace/ 

所以修复你的代码是,你应该将扩展路径分配给您的变量,而不是未展开的形式:

  valueToTest =〜/ .workspace / ##正确分配。 
valueToTest =〜'/。workspace /'##正确赋值。
valueToTest =〜/。workspace /##正确赋值。

valueToTest ='〜/ .workspace /'##分配不正确。
valueToTest =〜/ .workspace /##分配不正确。

set - 〜/ .workspace / ##正确赋值。
valueToTest = $ 1 ##(模拟bash script.sh〜/ .workspace /)

set - 〜/ .workspace /##分配不正确。
valueToTest = $ 1



Hack



如果不可避免只存储未展开的表单,可以使用 printf%q eval 展开你的字符串到目前为止,我发现足够安全:

  printf -v temp%q$ valueToTest
evalvalueToTest = $ temp

然后测试 $ valueToTest



更新



在Bash 4.3中, printf%q 也会引用波浪符号()。要解决这个问题,可以让这些角色再次被引用:

  printf -v temp%q$ valueToTest
temp = $ {temp // \\\〜/ \〜}
evalvalueToTest = $ temp

您还可以允许 $ HOME 展开:

  printf -v temp%q$ valueToTest
temp = $ {temp // \\\\〜/ \〜}
temp = $ {temp // \ \\ $ HOME / \ $ HOME}
evalvalueToTest = $ temp

另一个可能的修复也是直接转换它们:

  valueToTest = $ {valueToTest // \〜/ $ HOME } 
valueToTest = $ {valueToTest // \ $ HOME / $ HOME}


I am getting a weird error, can't seem to figure out why.

Especially because it works in one place but not in another scenario.

I have his code that checks whether these directories exist - and the HOME dirs with ~ is failing in this code snippet:

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

I get output:

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

Like I said it happens ONLY with the ~ expansion to represent my HOME directory.

And this is the ONLY place this is happening as I have OTHER code that checks for path with ~ ie my HOME directory with ~ expansion, AND they work fine!

The directories are being read from value part of an associative array - but I can't see why that would be a problem. Also you can see the output has no quotes or such associated with it.

I have tried with and without double-quotes - no luck.

As in:

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

Thank you for help.

解决方案

Tilde expansion does not happen when ~ is quoted in any way. And unlike pathname or filename expansion, ~ also doesn't expand when it's part of a variable.

If $valueToTest is ~/.workspace/, all of these forms would not work:

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

And is just synonymous to:

test ! -d '~/.workspace/'

But this would work:

test ! -d ~/.workspace/

Or

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

So the fix to your code is that, you should assign the expanded path to your variable instead, and not the unexpanded form:

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

The Hack

If it's unavoidable that only the unexpanded form is stored, you can use printf %q and eval to expand your string. So far I find good enough and safe:

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

Then test $valueToTest the way you do.

Update

In Bash 4.3, printf %q would already quote tilde characters (~) as well. To fix this you can make those characters unquoted again:

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

You can also allow $HOME to expand:

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

Another possible fix also is to just convert them directly:

valueToTest=${valueToTest//\~/$HOME}
valueToTest=${valueToTest//\$HOME/$HOME}

这篇关于在使用波浪号扩展的HOME目录下测试消极的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆