如何将目录内文件复制到其子目录?shell脚本if参数过多报错求解
错误原因排查
- 直接原因:你没有将文件名存为数组,
elem=$(ls)是将所有ls输出的内容存为单个字符串变量,后续$elem[$i]展开后会变成一长串拼接的文件名加[$i]后缀,[ -e ... ]条件收到的参数数量超出预期,就会抛出「参数过多」的报错。 - 其他语法逻辑错误:
- 遍历索引的写法错误:
for i in {$count}只会输出{数字}格式的单个值,不会生成1到指定数值的遍历序列 - shell数组取值语法错误:正确写法是
${数组名[索引]},而非$数组名[索引] - 用
ls输出获取文件名的方式本身存在缺陷,遇到带空格、换行、特殊字符的文件名会直接拆分错误 - 所有变量引用没有加双引号,遇到带空格的文件名会直接解析异常
- 遍历索引的写法错误:
可用实现方案
你的需求不需要计数、索引遍历这么复杂的逻辑,直接遍历当前目录文件即可,以下是可直接运行的代码:
#!/bin/bash # 先保证目标子目录存在,不存在则自动创建 mkdir -p artists_copy # 遍历当前目录下所有文件 for file in *; do # 仅复制普通文件,跳过子目录 if [ -f "$file" ]; then cp "$file" artists_copy/ echo "Copied file $file to artists_copy" fi done
如果需要参考正确的数组写法,以下是对应实现:
#!/bin/bash mkdir -p artists_copy # 定义数组存储当前目录所有文件名 file_list=(*) # 获取数组元素总数 count=${#file_list[@]} # 遍历数组索引 for ((i=0; i<count; i++)); do current_file=${file_list[$i]} if [ -f "$current_file" ]; then cp "$current_file" artists_copy/ echo "Copied file $current_file to artists_copy" fi done
内容的提问来源于stack exchange,提问作者Jan Torres Rodríguez
相关产品推荐
相关产品推荐

