我编写了一个脚本,必须在用户定义的目录中找到一些文件,这些文件可能包含波形符号(因此,可能有user_defined_directory='~/foo'
)。构造看起来像
found_files=$(find "$user_defined_directory" -type f … )
我使用引号来覆盖该路径中的可能空格,但根据手册页,波形扩展在引号中不起作用。我知道可能会进行此扩展的:
运算符,但我无法弄清楚如何在此处使用它。
'user-defined-directory'取自用户$ HOME目录中的另一个配置文件。它没有作为参数传递给我的脚本,它是从我写的脚本中的另一个配置中解析出来的。
答案 0 :(得分:6)
这给出了一些相当合理的假设,但它远非明显的代码(也不是单行代码):
# 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()
to home directory的答案,该答案解释了POSIX要求~
扩展为$HOME
的当前值,但~user
会扩展为主目录的值来自密码数据库。
答案 1 :(得分:5)
您可以使用"${user_defined_directory/#~/$HOME}"
替换"〜"在字符串的开头与当前用户的主目录。请注意,这不会处理~username/subdir
格式,只会处理普通~
。如果您需要处理更复杂的版本,则需要编写更复杂的转换器。
答案 2 :(得分:0)
Tilde肯定不会扩大内部报价。可能还有其他一些bash技巧但我在这种情况下做的是:
find ~/"$user_defined_directory" -type f
即。从引号外移动~/
并在引号中保留其余路径。