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

Bash脚本如何获取参数传入的匹配模式对应的所有文件名?

解决Bash脚本中获取匹配模式所有文件名的问题

问题根源

当你执行my_command *.txt时,Shell会先完成路径扩展(globbing),把*.txt替换成所有匹配的文件名列表,实际传给脚本的是test1.txt test2.txt两个独立参数,而不是把*.txt作为单个参数。所以你用$1只能拿到第一个文件名,其他匹配文件在$2、$3等位置参数里。

正确解决方案

方法1:遍历所有位置参数(推荐)

直接用"$@"遍历所有传入的参数,它能正确处理带空格的文件名:

#!/bin/bash
# 遍历所有传入的文件名参数
for file in "$@"; do
    echo "$file"
done

保存为my_command.sh后,赋予执行权限:

chmod +x my_command.sh

执行命令:

./my_command.sh *.txt

就能输出所有匹配的.txt文件。

方法2:脚本内部处理模式(适用于参数是未展开的模式)

如果你需要脚本接收原始的模式字符串(比如执行时加引号./my_command.sh "*.txt"),可以在脚本内部手动展开模式:

#!/bin/bash
# 获取传入的模式
pattern="$1"
# 展开模式并遍历
for file in $pattern; do
    echo "$file"
done

注意:这种方式要谨慎使用,若模式包含特殊字符可能存在安全风险,新手优先使用方法1。

为什么你之前的尝试无效

  • ls $1/echo $1:仅处理第一个位置参数$1,只能拿到第一个文件。
  • for var in $1:循环对象是$1的内容(即第一个文件名),不会处理其他参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:52:08