在bash中填充目录列表中的数组

时间:2017-07-18 22:01:04

标签: arrays bash ls

我一直试图获取ls /Applications/的输出并将每一行放入一个数组中,然后对该数组进行for循环。

#!/bin/bash
ls /Applications | grep Adobe > adobeapps
adobearray=( 'cat "adobeapps" ')
for i in "${adobearray[@]}"
do
    codeigottadowith $i
done
exit

它没有用,我发现即使我尝试用以下方法声明一个简单的数组:

declare -a adobearray=(item1 item2 item3); echo $adobearray[1];

输出为item1 [1]。它采用第一个元素并使整个数组。为什么这是错的?我做什么蠢事?在bash中有更好的方法将ls的输出发送到数组吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

什么是正确的方法?

#!/bin/bash

# Cause a glob with no results to result in empty output, rather than to evaluate
# back to itself.
shopt -s nullglob

# Expand the glob /Applications/*Adobe* into an array
adobe_array=( /Applications/*Adobe* )

# Trim the prefix /Applications/ from each element of that array
adobe_array=( "${adobe_array[@]#/Applications/}" )

# Iterate over that array
for i in "${adobe_array[@]}"; do
  codeigottadowith "$i"
done

之前出了什么问题?

  • Parsing ls is inherently fault-prone。该命令旨在使其输出由人而不是程序读取,并且它不支持强大地解决相关问题所需的功能(例如NUL分隔输出)。
  • adobearray=( 'cat "adobeapps" ') - 这会将字符串cat "adobeapps"本身作为唯一元素放入数组中;它根本没有实际运行cat命令。如果确实想要从文件中读取数据,那么最好使用mapfile代替(如果定位bash 4.0或更新版本),尽管从生成的文件中读取ls adobearray=( $(cat "adobeapps") )首先是不合适的。
  • Adobe Acrobat - 这更接近,但错误。如果应用程序名称包含空格(并且Adobe PhotoshopAdobe都包含空格),则您将Acrobat作为一个条目,* Adobe Foobar *作为另一个条目。*。如果你有一个名为echo $adobearray[1]的程序,那么echo "${adobearray[1]}"将替换为当前目录中调用此代码的其他文件的名称。
  • task runTest(type: Exec) { workingDir "$buildDir/test" commandLine "cmd", "/c", "test.bat" } - 为了索引数组,需要使用大括号来包围参数扩展;使用 #!/usr/bin/ruby require 'bitcoin-client' require 'net/http' require 'sinatra' require 'json' require 'gon-sinatra' Sinatra::register Gon::Sinatra class MySinatraApplication < Sinatra::Base register Gon::Sinatra @price = `ruby fiat.rb ` gon.price = @price end 发出数组中的第二项(第一项是索引0)。