Bash脚本含通配符与空格路径的cd命令报错求助
解决Bash脚本中带空格路径的
cd问题 这个问题我刚学Bash的时候也踩过坑!核心原因是Bash的分词机制在搞鬼——当你不加引号引用变量时,空格会把完整路径拆成多个独立的参数,cd自然找不到被拆碎的部分。咱们一步步来解决:
问题根源拆解
你原来的脚本里,${MOBILE}展开后是/run/user/1000/gvfs/mtp*/Internal shared storage,因为没加引号,Bash会把它拆成三个部分:/run/user/1000/gvfs/mtp*/Internal、shared、storage,cd只会尝试进入第一个不存在的路径,所以报错。
方案1:给变量引用加双引号(最直接)
这是新手最容易上手的解法,双引号会保留路径里的空格,阻止Bash拆分参数。修改后的脚本如下:
#!/bin/bash MOBILE="/run/user/${UID}/gvfs/mtp*/Internal shared storage" cd "${MOBILE}/"
只要确保引用变量时用"${MOBILE}",整个路径就会作为一个完整的参数传给cd,空格不会再搞破坏。
方案2:用循环处理通配符(更健壮)
如果担心同时连接多个Android设备导致mtp*匹配到多个目录,可以用循环遍历匹配结果,确保只处理存在的目录:
#!/bin/bash # 遍历所有匹配的mtp设备路径 for mobile_path in "/run/user/${UID}/gvfs/mtp"*"/Internal shared storage"; do # 先检查路径是否是存在的目录 if [ -d "$mobile_path" ]; then # 进入目录,失败则直接退出脚本 cd "$mobile_path" || exit 1 echo "成功进入设备目录:$mobile_path" # 这里可以添加你后续要执行的命令 break # 只处理第一个匹配到的设备,多设备场景可删除此行 fi done
这个写法能避免通配符匹配多个路径时的报错,还能自动跳过不存在的路径,容错性更强。
新手必记小提示
- 只要路径里有空格、特殊字符(比如
&、*),引用时一定要用双引号包裹,这是Bash脚本的基本规范。 - 可以先手动执行
ls "/run/user/${UID}/gvfs/mtp*",确认你的Android设备已经正确挂载,避免脚本找不到路径。
内容的提问来源于stack exchange,提问作者s3voch7
相关产品推荐
相关产品推荐

