如何将bash中ls命令的输出拆分保存为$File1、$File2等独立变量
实现方法
首先非常不建议直接拆分ls的输出处理,遇到文件名带空格、换行、特殊符号的场景会直接出错,优先用以下两种方案实现:
方案1:使用数组存储(最推荐)
Bash 原生支持数组类型,直接用通配符匹配文件路径存入数组即可,完全规避解析ls的坑:
# 将 ~/Downloads 下的所有文件/目录名存入 File 数组 File=(~/Downloads/*) # 数组下标从0开始,对应你需要的变量依次取对应下标即可 echo "${File[0]}" echo "${File[1]}" echo "${File[2]}"
输出结果和你要求的$File1/$File2/$File3完全一致,只是命名格式为数组下标形式。
方案2:动态生成带编号的独立变量
如果一定要用$File1/$File2/$File3这类带数字后缀的独立变量,可以结合数组和declare做动态赋值:
# 先将所有文件存入数组 all_files=(~/Downloads/*) # 遍历数组生成带编号的变量,序号从1开始 for idx in "${!all_files[@]}"; do declare "File$((idx+1))=${all_files[$idx]}" done # 直接调用对应变量即可 echo "$File1" echo "$File2" echo "$File3"
特殊场景:需要用ls的排序规则取文件
如果你确实需要用到ls的排序能力(比如按修改时间、文件大小排序),可以用mapfile配合进程替换安全读取ls的逐行输出:
# 示例:按修改时间倒序读取 ~/Downloads 下的文件存入数组 mapfile -t all_files < <(ls -1t ~/Downloads/) # 后续动态赋值逻辑和方案2一致
内容的提问来源于stack exchange,提问作者Xiaomi Account
相关产品推荐
相关产品推荐

