在bash中安装失败后,apt-get无法继续在循环中运行

时间:2014-11-30 23:11:56

标签: bash apt-get

我正在尝试创建一个使用apt-get自动安装内容的bash脚本。我使用以下方法进行安装:

方法1

Install(){
for TempVar in "$1"
do
eval 'sudo apt-get install '$TempVar
done
}

方法2

Install(){
eval 'sudo apt-get install '$TempVar
}

for TempVar in "$1"
do
Install '(insert programs here separated by spaces)'
done

在两种情况下,如果安装失败,apt-get会拒绝安装其他任何东西。当然,在for循环结束后,apt-get通常在同一个脚本中运行。我的印象是apt-get保留其错误状态,直到它执行的循环完全终止。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

每个循环只安装一个包,每次调用apt-get。由于每个apt-get都是作为一个单独的命令运行,所以它不会在错误中停止循环,因为每个apt-get都在运行。

我认为你想要的是

sudo apt-get install $1

编辑:如果你引用" $ 1"它将创建一个包含空格的长包名称,这可能不是您想要的。如果您的脚本参数包含空格,请使用" $ @" (附近有引号)。 $ @将按原样重现脚本args,并在正确的位置放置空格。

答案 1 :(得分:1)

正如其他人已经指出的那样,你的报价已经过去了。事实上,循环是多余的,因为for anything in "$1"将始终只执行一个循环体。

可以使用for anything in "$@"解决这个问题,但事实上,我认为你的评价是错误的。只需添加一个选项;

sudo apt-get install --ignore-missing list of packages without quotes

答案 2 :(得分:0)

我认为您的代码失败是因为您在 one apt-get命令中执行了所有安装。并且apt-get进程逐个给出它的参数。因此,当其中一个参数失败时,后面的所有内容都将被忽略。

所以,在你的调用代码中,你只给它一个参数,即引用的字符串'pkg1 pkg2 pk3':

Install 'pkg1 pgk2 pkg3'

然后在你的函数中,eval获取一个参数字符串,并将其转换为带有3个包参数的 single apt-get命令。

我刚刚编写并测试了以下内容。我认为这就是你想要的:

#!/bin/bash

function my_install() {
    for p in "$@"
    do
    sudo apt-get --yes install $p
    done
}


# here, call:
# my_install pkg1 pkg2 pkg3

注意,我没有将我的包列表参数引用到我的函数中。另请注意,我在for循环中使用“$ @”。