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
相关产品推荐
相关产品推荐

