检查目录是否存在使用主字符(〜)在bash中失败

为什么下面的bash检查一个目录是否失败?

 if [ ! -d "~/Desktop" ]; then echo "DOES NOT EXIST" exit 1; fi 

~/Desktop确实存在。 这是在Mac上的方式。


问题在于这种types的脚本

 read -p "Provide the destination directory: " DESTINATION if [ ! -d $DESTINATION ]; then echo "\t'$DESTINATION' does not exist." >&2; exit 1; fi 

贾斯汀在他对Quanta答案的第一个评论中澄清了他的问题。 他正在使用read (或通过其他dynamic方式) read一行文本,并希望扩展代字符。

问题就变成了“你如何在一个variables的内容上进行波浪扩展?”

一般的方法是使用eval ,但它带有一些重要的注意事项,即variables中的空格和输出redirect( > )。 以下似乎为我工作:

 read -p "Provide the destination directory: " DESTINATION if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then echo "'$DESTINATION' does not exist." >&2; exit 1; fi 

尝试以下每个input:

 ~ ~/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 

现在,当用户input代字号并点击选项卡时,它将展开。 但是,这种方法并不能取代上面的eval方法,因为只有当用户点击标签时才会进行扩展。 如果他只是input〜/ foo并点击input,它将保持为代字符。

也可以看看:

删除目录周围的双引号,看它是否工作:

 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

删除双引号,它应该工作。

 echo $HOME 

使用$HOME ,并确保用户正在使用脚本。 如果root使用~它将在/root查找,而不是/home/$USER

 if [ ! -d "$HOME/Desktop" ]; then echo "DOES NOT EXIST" exit 1; fi 
 if [ ! -d "$HOME/Desktop" ]; then echo "DOES NOT EXIST" exit 1; fi 

应该是$ HOME而不是〜

〜是一个键盘的东西