为了账号安全,请及时绑定邮箱和手机立即绑定

蒂尔德报价

蒂尔德报价

我编写了一个脚本,该脚本必须在用户定义的目录中找到一些可能包含波浪号的文件(因此可能有user_defined_directory='~/foo')。构造看起来像found_files=$(find "$user_defined_directory" -type f … )我使用引号来覆盖该路径中的可能空格,但是根据手册页,代字号扩展无法在引号中起作用。我知道:运算符可能可以进行这种扩展,但是我不知道在这里如何使用它。从用户$ HOME目录中的另一个配置文件获取“用户定义目录”。它没有作为参数传递给我的脚本,而是从我编写的脚本中的另一个配置进行解析的。
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以使用"${user_defined_directory/#~/$HOME}"当前用户的主目录替换字符串开头的“〜”。请注意,这不会处理~username/subdir格式,只能处理纯格式~。如果需要处理更复杂的版本,则需要编写一个更复杂的转换器。


查看完整回答
反对 回复 2019-10-22
?
心有法竹

TA贡献1866条经验 获得超5个赞

在给出一些相当合理的假设的情况下,此方法有效,但它远非显而易见的代码(而且也不是单行代码):


# Working function - painful, but can you simplify any of it?

# NB: Assumes that ~user does not expand to a name with double spaces or

#     tabs or newlines, etc.


expand_tilde()

{

    case "$1" in

    (\~)        echo "$HOME";;

    (\~/*)      echo "$HOME/${1#\~/}";;

    (\~[^/]*/*) local user=$(eval echo ${1%%/*})

                echo "$user/${1#*/}";;

    (\~[^/]*)   eval echo ${1};;

    (*)         echo "$1";;

    esac

}


# Test cases


name1="~/Documents/over  enthusiastic"

name2="~crl/Documents/double  spaced"

name3="/work/whiffle/two  spaces  are  better  than one"


expand_tilde "$name1"

expand_tilde "$name2"

expand_tilde "$name3"

expand_tilde "~"

expand_tilde "~/"

expand_tilde "~crl"

expand_tilde "~crl/"


# This is illustrative of the 'normal use' of expand_tilde function

x=$(expand_tilde "$name1")

echo "x=[$x]"

在我的机器(有一个用户crl)上运行时,输出为:


/Users/jleffler/Documents/over  enthusiastic

/Users/crl/Documents/double  spaced

/work/whiffle/two  spaces  are  better  than one

/Users/jleffler

/Users/jleffler/

/Users/crl

/Users/crl/

x=[/Users/jleffler/Documents/over  enthusiastic]

该功能分别tilde_expansion处理不同情况。第一个子句处理一个值~并简单地替换$HOME。第二种情况是偏执狂:~/映射到$HOME/。第三个处理~/anything(包括一个空的“任何东西”)。下一种情况处理~user。包罗万象*处理其他所有问题。


请注意,该代码做出了(合理的)假设,即~user不会扩展为包含任何双精度空格,任何制表符或换行符(以及可能还有其他类似空格的字符)的值。如果您必须解决这个问题,生活将是地狱。


请注意chdir()主目录的答案,该答案说明POSIX需要~扩展为当前值$HOME,但~user必须从密码数据库扩展为主目录的值。


查看完整回答
反对 回复 2019-10-22
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

提尔德(Tilde)绝对不会在报价内扩展。可能还有其他bash技巧,但是在这种情况下,我要做的是:


find ~/"$user_defined_directory" -type f

即,将~/引号外的引号移开,并将其余路径保留在引号中。


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 507 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信