我一直试图获取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的输出发送到数组吗?
感谢您的帮助!
答案 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
ls
is inherently fault-prone。该命令旨在使其输出由人而不是程序读取,并且它不支持强大地解决相关问题所需的功能(例如NUL分隔输出)。adobearray=( 'cat "adobeapps" ')
- 这会将字符串cat "adobeapps"
本身作为唯一元素放入数组中;它根本没有实际运行cat
命令。如果确实想要从文件中读取数据,那么最好使用mapfile
代替(如果定位bash 4.0或更新版本),尽管从生成的文件中读取ls
adobearray=( $(cat "adobeapps") )
首先是不合适的。Adobe Acrobat
- 这更接近,但也错误。如果应用程序名称包含空格(并且Adobe Photoshop
和Adobe
都包含空格),则您将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)。