如何把shell命令的输出按行存入数组

下载了一些电视剧,需要把 Downloads 目录下面的mkv文件统一存到一个文件夹中。第一次写 shell 脚本在处理find命令返回的结果时遇到了一些问题。

方法1

使用readarray 内建方法,readarray命令用于从标准输入或选项“-u”指定的文件描述符fd中读取文本行。

readarrary -t file_paths << "$(find ~/Downloads -name '*.mkv')"

这样find返回的mkv文件路径就被存到一个数组中了,然后就可以处理文件了。

但是,很不幸mac os x 不支持readarray这个命令,所以必须用其他方法。

方法2

这里要使用IFS这个变量。下面是对IFS的说明:

$IFS=$'\n' : $IFS is bash's [input field separator] setting it to the newline character only (\n) ensures that your output lines won't be split on whitespace so that you can save each >line as a separate array element. Without this, each word of your command's output would >be a different element.

所以,解决的方法就是:

oldifs = "$IFS"
IFS=$'\n'
file_paths=($(find ~/ -name '*.mkv'))
for file in ${file_paths[@]}
do
# do your command here
done 
IFS="$oldifs" # 别忘了把IFS改回去

写 python 比较多,加之第一次写shell脚本,第一次把 for 写成:

for file in ${file_paths}

结果只处理了第一项。shell 脚本中的数组名有点类似 C 中的数组名的用法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,669评论 0 5
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,439评论 3 53
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,403评论 19 139
  • 有些人说;“北京哪都不好,但我要在这发展出人头地,所以不会离开”。在我看来,这些同胞仅将北京当作跳板,那么北京也并...
    房檐儿上的猫阅读 454评论 0 0
  • 枚七\文 这世上最高兴的事莫过于 经过自己的努力 达到了自己想要的样子 是否还在茫然,是否还是一如既往的荒废时光。...
    总会遇到爱你的人阅读 339评论 0 0

友情链接更多精彩内容