为什么在这个shell脚本中,用$@从一个函数传递到另一个函数的参数会“丢失”?

lg40wkob  于 2023-02-09  发布在  Shell
关注(0)|答案(1)|浏览(138)

我正在尝试编写一些shell脚本(用于Docker和VSCode开发容器),但我完全是个新手。我正在尝试复制utility script found here,它确实非常简单:

# Checks if command exists, installs it if not
# check_command <command> "<apt packages to install>" "<apk packages to install>" "<dnf/yum packages to install>"
check_command() {
    command_to_check=$1
    shift
    if type "${command_to_check}" > /dev/null 2>&1; then
        return 0
    fi
    install_packages "$@"
    return $?
}

# Installs packages using the appropriate package manager (apt, apk, dnf, or yum)
# install_packages "<apt packages to install>" "<apk packages to install>" "<dnf/yum packages to install>"
install_packages() {
    if type apt-get > /dev/null 2>&1; then
        apt_get_update_if_needed
        apt-get -y install --no-install-recommends $1
    elif type apk > /dev/null 2>&1; then
        apk add $2
    elif type dnf > /dev/null 2>&1; then
        dnf install -y $3
    elif type yum > /dev/null 2>&1; then
        yum install -y $3
    else
        echo "Unable to find package manager to install ${command_to_check}"
        exit 1
    fi
}

其中一个应该包含utils.sh并运行check_command curl来安装curl,如果需要的话。在my install.s h中,我正在做的是:

#!/usr/bin/env bash
set -e

# Import common utils
. ./utils.sh

 # Verify dependencies
apt_get_update_if_exists
check_command curl
curl -o /usr/local/foo https://foo.example

此脚本失败:
./www.example.com:第10行: curl :install.sh: line 10: curl: command not found
check_command中添加调试行显示install_packages "$@"为空,即参数"curl"未正确传递给install_packages
任何有助于理解为什么会发生这种情况的帮助都非常感谢。

xwbd5t1u

xwbd5t1u1#

你的check_command函数调用了install_packages的所有参数,但是只调用了一个参数,当然install_packages也只接收一个参数,但是你让它引用了$2$3,你也可以把它们放在双引号里。

相关问题