在使用波浪号扩展的HOME目录下测试消极 [英] Getting negative on test for HOME directories with tilde ~ expansion
问题描述
特别是因为它在一个地方工作,而在另一个场景中不起作用。
>我有他的代码检查这些目录是否存在 -
和与〜的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屋!