Bash

即使我嘗試了,Bash 仍然會刪除第三個參數的最後一部分*‘和d_‘∗‘一個nd‘*and@`

  • March 6, 2022

我嘗試了以下問題:

我正在執行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 "${@}")

我也已經在最後一個參數中替換了,但沒有成功" "' '

例如,它剪切了參數的最後一部分,git p7zip wget unzip zstd並且htop micro neofetch neovim zsh不會安裝整體。

您需要-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

Whereget_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 發行版的名稱。

引用自:https://unix.stackexchange.com/questions/693105