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 に答える