You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:00:23