1

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

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

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

4

1 回答 1

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 语句中对$2to的引用。$pkg

在旁边

当您使用它时,以防万一任何参数包含空格,请替换:

for pkg in $@;

for pkg in "$@";
于 2014-11-24T22:34:35.213 回答