为什么下面的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而不是〜
〜是一个键盘的东西