即使我尝试了 `$*` 和 `$@`,Bash 仍然剪切了第三个参数的最后一部分

即使我尝试了 `$*` 和 `$@`,Bash 仍然剪切了第三个参数的最后一部分

我尝试过以下问题:

我正在运行docker-compose检查 Dockerfile。

看我的脚本:

archlinux="pacman"

get_package_manager_install()
{
  if [[ -x "$(command -v $1)" ]]; then
    "$1 $2 $3"
  else        
    echo "Gestor do pacote desconhecido" &>/dev/null;
  fi
}

get_package_manager_install "$archlinux"     "-S --noconfirm --needed" "ca-certificates curl git p7zip wget unzip zstd"
get_package_manager_install "$archlinux"     "-S --noconfirm --needed" "htop micro neofetch neovim zsh"
get_package_manager_install "$archlinux"     "-S --noconfirm --needed" "luit xdotool xdriinfo xorg-appres xorg-iceauth xorg-xcmsdb xorg-xgamma xorg-sessreg xorg-xdpyinfo xorg-xev xorg-xfd xorg-xfontsel xorg-xhost xorg-xkbcomp xorg-xkill xorg-xlsatoms xorg-xlsclients xorg-xlsfonts xorg-xmessage xorg-xmodmap xorg-xprop xorg-xrandr xorg-xrdb xorg-xrefresh xorg-xset xorg-xvidtune xorg-xvinfo xorg-xwininfo"

请注意,我也已经替换"$1 $2 $3"$@or $*。我也尝试过$(echo "$@")并且$(echo "${@}")

我也已经在最后一个参数中替换了" "with ,但没有成功。' '

例如,它删除了参数的最后一部分,git p7zip wget unzip zstd并且整个htop micro neofetch neovim zsh将不会被安装。

答案1

您需要-S--noconfirm--needed并将包作为单独的参数传递给pacman,因此:

archlinux="pacman"

get_package_manager_install()
{
  if command -v -- "$1" > /dev/null 2>&1; then
    "$@"
  else        
    echo >&2 "Gestor do pacote desconhecido"
    return 1
  fi
}

get_package_manager_install "$archlinux" -S --noconfirm --needed ca-certificates curl git p7zip wget unzip zstd

get_package_manager_install所有这些作为单独的参数传递到哪里,并将get_package_manager_install它们按原样传递到pacman.

如果您只想get_package_manager_install采用 3 个参数,并且将第二个和第三个参数按空格字符分割以生成要传递给的参数列表pacman,则可以使用 split+glob 运算符(您已经错误地使用了该运算符,因为忘记$1在您的代码),在禁用 glob 部分并设置$IFS为空格后:

get_package_manager_install() {
  if command -v -- "$1" > /dev/null 2>&1; then
    (
      set -o noglob
      IFS=' '
      exec "$1" $2 $2
    )
  else        
    echo >&2 "Gestor do pacote desconhecido"
    return 1
  fi
}

get_package_manager_install "$archlinux" \
                            '-S --noconfirm --needed'
                            'ca-certificates curl git p7zip wget unzip zstd'

虽然我无法想象你为什么要这么做。

我也不清楚为什么要命名包含包管理器名称的变量,archlinux该名称是 Linux 发行版的名称。

相关内容