shell脚本循环数组作为参数传递给多参数函数?

时间:2014-11-24 22:27:47

标签: macos bash shell homebrew homebrew-cask

我正在尝试做这样的事情:

function install {
  cmd=$1
  shift
  for pkg in "$@";
  do
   if $cmd $pkg; then
    echo "Installed $pkg"
   else
    echo "Failed to install $pkg"
   fi
  done
}

brews=(git node scala sbt zsh caskroom/cask/brew-cask)
casks=(dropbox google-chrome spotify)

install 'brew install' $brews
install 'brew cask install' $casks

但是,这仅适用于每个阵列的第一个元素。为什么不拿起其余的数组元素?

1 个答案:

答案 0 :(得分:0)

修订问题

替换:

install 'brew install' $brews
install 'brew cask install' $casks

使用:

install 'brew install' "${brews[@]}"
install 'brew cask install' "${casks[@]}"

要理解原因,请遵守:

$ brews=(git node scala sbt zsh caskroom/cask/brew-cask)
$ echo $brews
git
$ echo "${brews[@]}"
git node scala sbt zsh caskroom/cask/brew-cask

如您所见,在bash下,$brews仅引用数组的第一个元素。相比之下,"${brews[@]}"将扩展到数组的所有成员,每个成员都有一个单独的单词。

原始问题

替换:

if $cmd $2; then

使用:

if $cmd "$pkg"; then

同样在echo语句中替换对$2$pkg的引用。

除了

当你在它时,以防任何参数包含空格,替换:

for pkg in $@;

使用

for pkg in "$@";