Bash变量赋值右侧加引号时波浪号~无法展开的问题排查
问题原因:Bash中波浪号(~)的展开规则
这个问题的核心在于Bash对波浪号()的展开时机和条件**——只有当处于未被引号包裹的词首位置**时,它才会被解析为当前用户的家目录(或者指定用户的家目录,比如~root对应root的家目录)。
先看报错的脚本为什么失败
x="myDir" dirName="~/test_$x" # 这里的~被双引号包裹了 cd $dirName echo "hey" > test.txt
在双引号内部,Bash只会展开变量(比如$x会被替换成myDir),但不会处理波浪号的展开。所以最终dirName的值是字面字符串~/test_myDir,而不是你期望的/home/你的用户名/test_myDir。
当你执行cd $dirName时,系统会尝试寻找当前工作目录下名为~的文件夹,再进入里面的test_myDir——显然这个路径不存在,所以抛出"No such file or directory"错误。
为什么去掉引号后能正常运行
x="myDir" dirName=~/test_$x # 无引号,~处于词首 cd $dirName echo "hey" > test.txt
这里没有用引号包裹赋值语句,处于整个词的开头,Bash会先把展开为你的家目录(比如/home/jason),然后再替换$x的值,最终dirName被赋值为正确的路径/home/jason/test_myDir,cd自然能找到这个目录。
替代方案:用$HOME代替~(适合需要引号的场景)
如果你的复杂脚本中必须用引号(比如路径里有空格,或者要避免其他特殊字符被意外解析),可以用$HOME代替~,因为$HOME是环境变量,在双引号里会正常展开:
x="myDir" dirName="$HOME/test_$x" # 双引号内$HOME会被展开成家目录路径 cd "$dirName" # 这里最好也给dirName加引号,避免路径含空格时出错 echo "hey" > test.txt
内容的提问来源于stack exchange,提问作者Jason Rohrer
相关产品推荐
相关产品推荐

