Answers:
贾斯汀(Justin)在对量子答案的第一篇评论中澄清了他的问题。他正在使用read
(或通过其他一些动态方式)阅读一行文本,并希望扩展波浪线。
问题变成“如何对变量的内容执行波浪号扩展?”
通用方法是使用eval
,但是它带有一些重要的警告,即>
变量中的空格和输出重定向()。以下内容似乎对我有用:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
尝试使用以下每个输入:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
${mypath//>}
剔除>
这可能在揍一个文件中的字符eval
。 eval echo ...
是什么是实际的波浪线扩展eval
用于支持带空格的文件名。作为对此的补充,您可以通过添加以下-e
选项来改进UX :
read -p "Provide the destination directory: " -e DESTINATION
现在,当用户键入波浪号并单击选项卡时,它将展开。但是,此方法不能代替上面的评估方法,因为扩展仅在用户单击选项卡时发生。如果他只是输入〜/ foo并按回车,它将保留为波浪号。
也可以看看:
删除目录周围的双引号以查看其是否有效:
if [ ! -d ~/Desktop ]; then
echo "DOES NOT EXIST"
exit 1;
fi
其原因是波浪号扩展名仅在未引用时才起作用。
info "(bash) Tilde Expansion"
3.5.2 Tilde Expansion
---------------------
If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX. If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable. If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.
它不仅在Mac上不起作用,而且在运行bash的任何平台上也不起作用。
当您引用“〜/ Desktop”时,您是在告诉bash在〜文件夹中查找Desktop。引用删除了〜的特殊目的
参见-http: //www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
删除双引号,它应该工作。
cd "~/Desktop"
您也会收到错误消息。它必须不加引号或存储为变量(不带引号)。例如,a=~/Desktop; cd $a;
工作原理,但并不a="~/Desktop"; cd Desktop;
见serverfault.com/questions/417252/...