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

为什么bash遍历字符串变量时会将问号转换为短横线?

问题原因

该输出异常是Bash的通配符(路径名扩展)机制导致的,触发逻辑如下:

  • 你写的for v in $var中$var没有用双引号包裹,Bash对未加引号的变量会先后执行单词拆分、路径名扩展两步处理。
  • 你的var值拆分后得到三个片段:bonjour、?、hello,其中?是Bash内置通配符,作用是匹配当前工作目录下所有名称为单个字符的文件。
  • 你当前运行脚本的目录下,正好存在且仅存在一个名称为单个短横线-的文件,因此通配符?被自动替换为了匹配到的文件名-,就出现了不符合预期的输出。

修复方案

可以选择任意一种方式解决:

  1. 脚本开头关闭路径名扩展功能:
set -f
i=0
var='bonjour ? hello' 
for v in $var
do ((i++))
echo -e "$i)$v"
done
  1. 改用数组存储要遍历的元素,避免通配符被意外展开:
i=0
# 用数组定义元素,带特殊字符的元素手动加引号包裹
var=(bonjour '?' hello)
for v in "${var[@]}"
do ((i++))
echo -e "$i)$v"
done

内容的提问来源于stack exchange,提问作者programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:24:01