在bash中是否可以使用包含波形符(〜)和空格的文件夹?

时间:2017-02-22 12:31:14

标签: bash macos

在bash脚本中,我想使用存储在默认系统中的值。要检索该值,我会这样做:

defaults read my.domain my_key
#returns "~/Dropbox (My Company)/"

当我在bash脚本中执行以下操作时,波形符(〜)不会被展开(我因为简洁而删除了错误处理):

my_key=$(defaults read my.domain my_key)
echo $my_key
#output: "~/Dropbox (My Company)/"

基本上,这个问题可以证明:

my_key='~/Dropbox (My Company)/'
echo $my_key

波浪线未展开,因为文件名在引号之间(不确定它是否与此完全相同)。当我想强制波浪扩展时,它会抱怨括号(-bash: syntax error near unexpected token '('):

eval my_key='~/Dropbox (My Company)/'

目前,我只是将完整路径保存到默认系统(默认为my.domain my_key -string“/ Users / xxx / Dropbox(我的公司)”),所以我不需要扩展。但我认为它应该适用于扩展,空格和括号。

我正在寻找合理的解决方案。

2 个答案:

答案 0 :(得分:3)

我不知道bash在OS X上的工作方式是否有所不同,但这似乎是仅扩展代字号并保持其余部分引用的方式:

my_key_escaped=$(printf %q "$my_key")
eval my_key_expanded=${my_key_escaped/#\\~/~}

首先引用所有内容(空格,代字号,美元......)然后取消引用前导\~(如果它在那里)。

答案 1 :(得分:-1)

无法正常工作:从另一个堆栈溢出问题,我来到了一个优雅的,但是#34; hacky",回答:

my_key=$(cd "$my_key";pwd)

我以为我找到了一个简单的答案......如果你想要简单,不要在路径名中使用特殊字符..

我把这个答案作为指针,如何不这样做。