Shell脚本出现too many arguments错误的原因排查咨询
Shell脚本"too many arguments"错误分析
核心原因
你遇到的too many arguments错误,根源是**[ -f ]命令无法处理通配符展开后的多个文件名**:
- 当
$Tname*.*匹配到多个文件时(比如Emp_table.csv、Emp_table.txt),这个表达式会被Shell自动展开成多个字符串,传递给[ -f ]命令。 - 而
[ -f ]只能接受单个文件路径作为参数,多个参数传入就会触发"参数过多"的错误。
代码里的其他问题
除了核心错误,你的脚本还有几个语法/逻辑问题:
- 变量引用错误:
Tname="$Table_name[index]"应该写成${Table_name[$index]},否则index会被当作字符串,而不是数组索引变量。 - 关键字大小写错误:Shell是大小写敏感的,
For要改成小写for,Rm要改成小写rm,否则会被当成未知命令。
修复方案
如果你的需求是删除所有匹配$Tname*.*的文件,有两种可行的修复方式:
方案1:直接删除(推荐)
Table_name[0]="Emp_table" for index in "${!Table_name[@]}"; do Tname="${Table_name[$index]}" rm -f "$Tname"*.* done
-f参数让rm在没有匹配文件时不报错,同时强制删除文件,省去额外的判断步骤。
方案2:先判断再删除(适配多文件场景)
Table_name[0]="Emp_table" for index in "${!Table_name[@]}"; do Tname="${Table_name[$index]}" # 用compgen检查是否有匹配的文件,避免参数过多问题 if compgen -G "$Tname*.*" > /dev/null; then rm "$Tname"*.* fi done
compgen -G会安全展开通配符,若有匹配项则输出结果,重定向到/dev/null仅做存在性判断,不会触发参数过多错误。
内容的提问来源于stack exchange,提问作者Rajkumar R
相关产品推荐
相关产品推荐

