我正在尝试创建一个使用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保留其错误状态,直到它执行的循环完全终止。有办法解决这个问题吗?
答案 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循环中使用“$ @”。