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

Shell脚本中如何在列表循环中正确打印特殊字符*?

解决Shell脚本中for循环遍历列表时通配符被展开的问题

问题原因

你遇到的问题是Shell的**路径扩展(Globbing)**机制导致的:当直接使用$list遍历字符串时,Shell会先对变量内容进行单词拆分,再将*这类通配符替换成当前目录下的所有文件列表,所以输出的是文件内容而非*本身。你之前修改echo的写法没用,因为通配符的展开发生在for循环解析$list的阶段,到echo时已经是处理后的结果了。

解决方案

方法一:使用数组存储列表(推荐)

用数组保存每个元素,能确保每个项都被当作独立字符串处理,不会触发通配符扩展:

#!/bin/sh

list=("bla1" "bla2" "*" "bla3")

for i in "${list[@]}"
do
    echo "$i"
done
  • 解析:"${list[@]}"会遍历数组的每个元素,且每个元素都保持原本的字符串形态,*不会被解析为通配符。

方法二:临时关闭路径扩展

如果必须使用字符串存储列表,可以在遍历前关闭Shell的通配符解析功能,遍历完成后再恢复:

#!/bin/sh

list="bla1 bla2 * bla3"

set -f # 关闭路径扩展,禁止通配符解析
for i in $list
do
    echo "$i"
done
set +f # 恢复路径扩展,不影响后续脚本逻辑
  • 解析:set -f会禁用Shell的Globbing功能,此时*会被当作普通字符处理;遍历结束后用set +f恢复默认行为,避免影响脚本其他部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:49