![在 Bash 中使用主字符 (~) 检查目录是否存在失败](https://linux22.com/image/592898/%E5%9C%A8%20Bash%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E4%B8%BB%E5%AD%97%E7%AC%A6%20(~)%20%E6%A3%80%E6%9F%A5%E7%9B%AE%E5%BD%95%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%A4%B1%E8%B4%A5.png)
为什么以下bash
检查目录是否失败?
if [ ! -d "~/Desktop" ]; then
echo "DOES NOT EXIST"
exit 1;
fi
~/Desktop
确实存在。顺便说一下,这是在 Mac 上。
问题在于这种类型的脚本
read -p "Provide the destination directory: " DESTINATION
if [ ! -d $DESTINATION ]; then
echo "\t'$DESTINATION' does not exist." >&2;
exit 1;
fi
答案1
read
Justin 在对 quanta 的回答的第一条评论中澄清了他的问题。他正在使用(或通过其他动态方式)读取一行文本,并希望扩展波浪线。
问题变成了“如何对变量的内容执行波浪号扩展?”
通用方法是使用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
:
read -p "Provide the destination directory: " -e DESTINATION
现在,当用户输入波浪符号并点击 Tab 键时,它将展开。这种方法不会代替但是,上面的 eval 方法,因为只有当用户按下 tab 键时才会发生扩展。如果他只是输入 ~/foo 并按下回车键,它将保持为波浪符号。
也可以看看:
答案2
删除目录周围的双引号,看看是否有效:
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.
答案3
它不仅适用于 Mac,而且适用于任何运行 bash 的平台。
当你引用“~/Desktop”时,你是在告诉 bash 在 ~ 文件夹中查找 Desktop。引用删除了 ~ 的特殊用途
看 - http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
删除双引号就可以了。
答案4
if [ ! -d "$HOME/Desktop" ]; then
echo "DOES NOT EXIST"
exit 1;
fi
应该是 $HOME 而不是 ~
~ 是键盘的事情