如何编写 shell 脚本来安装应用程序列表?

jum*_*ett 46 command-line apt scripts software-installation

有谁知道如何编写 shell 脚本来安装应用程序列表?每次设置新系统时都必须手动安装每个应用程序,这很痛苦。

编辑: 它仍然问我Do you want to continue [Y/n]?。有没有办法让脚本输入y或不提示输入?

Mic*_*haw 44

我假设脚本看起来像这样:

#!/bin/sh
apt-get update  # To get the latest package lists
apt-get install <package name> -y
#etc.
Run Code Online (Sandbox Code Playgroud)

只需将其另存为 install_my_apps.sh 之类的内容,更改文件的属性以使其可执行,然后以 root 身份从命令行运行它。

编辑:-y通知apt-get没有提示你,只是获得与安装)

  • 我不知道为什么这是 CW,但我还是编辑了它以放置 `-y` 标志。注意:如果你想让它看起来更清晰,你可以使用 `--yes` 或 `--assume-yes` 代替 `-y`。 (6认同)

qbi*_*qbi 22

好吧,根据您的问题,最简单的脚本是:

#!/bin/sh
LIST_OF_APPS="a b c d e"

aptitude update
aptitude install -y $LIST_OF_APPS
Run Code Online (Sandbox Code Playgroud)

但是,您也可以输入aptitude update && aptitude install -y a b c d e. 所以也许你的问题错过了这里的关键点。如果有一些进一步的要求,最好解释一下。

  • 请注意, apt-get 在这里可以作为 aptitude 的替代品,如果这是您的偏好。只需用“apt-get”替换“aptitude”的两个实例。 (2认同)

And*_*son 14

只需在文件 example.list 中创建应用程序列表,然后运行

cat example.list | xargs sudo apt-get -y install
Run Code Online (Sandbox Code Playgroud)


Yor*_*iev 9

#!/bin/bash

set -eu -o pipefail # fail on error and report it, debug all lines

sudo -n true
test $? -eq 0 || exit 1 "you should have sudo privilege to run this script"

echo installing the must-have pre-requisites
while read -r p ; do sudo apt-get install -y $p ; done < <(cat << "EOF"
    perl
    zip unzip
    exuberant-ctags
    mutt
    libxml-atom-perl
    postgresql-9.6
    libdbd-pgsql
    curl
    wget
    libwww-curl-perl
EOF
)

echo installing the nice-to-have pre-requisites
echo you have 5 seconds to proceed ...
echo or
echo hit Ctrl+C to quit
echo -e "\n"
sleep 6

sudo apt-get install -y tig
Run Code Online (Sandbox Code Playgroud)

解释

  • set -eu -o pipefail命令:

    命令元素 解释
    set 修改shell环境的运行方式
    -u 如果变量不存在,则报告错误并停止(例如,未绑定的变量)
    -e 每当发生错误时终止(例如,未找到命令)
    -o pipefail 如果子命令失败,则整个管道命令失败,终止脚本(例如,找不到命令)

    如果此脚本遇到任何错误,它将失败并退出。

    参考:https: //www.tutorialdocs.com/article/set-command-in-bash.html

  • sudo -n true命令:

    命令元素 解释
    sudo 以超级用户身份运行
    -n 非交互式。防止sudo提示输入密码。如果需要,sudo显示一条错误消息并退出
    true 返回成功(零)退出状态的内置命令

    以超级用户身份运行并且不要求输入密码。退出状态为成功。

    参考: https: //linux.die.net/man/8/sudo,https : //linux.die.net/abs-guide/internal.html

  • test $? -eq 0 || exit 1 "you should have sudo privilege to run this script"命令:

    命令元素 解释
    test 将表达式作为参数,将其计算为“0”( true) 或“1”( false),并将结果返回到 bash 变量$?
    $? 用于查找返回值作为最后执行命令的退出状态的变量
    -eq 等于
    0 值结果为真
    || 逻辑“OR”是布尔运算符。它可以根据另一个命令的退出状态执行命令或 shell 函数
    exit 以状态 N 退出 shell。如果未指定 N,则使用最后执行的命令的退出代码
    1 值结果为 false,此处用作退出命令的参数以用作退出代码
    "you should have sudo privilege to run this script" 如果退出代码为 false,则将此消息打印到终端

    测试最后一个变量的退出代码并查看它是否等于“0”。如果没有,则退出并显示错误并将给定消息打印到终端。

    参考: https: //linuxhint.com/bash-test-command/,http : //tldp.org/LDP/abs/html/exit-status.html#EXSREF,https : //bash.cyberciti.biz/guide /Logical_ORhttps://linuxize.com/post/bash-exit/

  • echo installing the must-have pre-requisites命令:

    命令元素 解释
    echo 用于将信息或消息打印到终端的内置命令
    installing the must-have pre-requisites 要打印到终端的消息

    告诉用户在安装实际程序之前将安装一些必备软件包。

    参考: https: //linuxhint.com/bash_echo/

  • while read -r p ;命令:

    命令元素 解释
    while 创建一个 while 循环,即只要给定的条件计算结果为真,就无限地执行给定的命令集
    read 从标准输入读取一行并将其存储在变量中
    -r 传递给命令的选项read可避免反斜杠转义被解释
    p read用于存储捕获的输入的任意变量。这里代表每个要安装的包
    ; 控制运算符 AND。继续执行下一个命令,无论上一个命令的退出状态如何(即使上一个命令失败也执行)

    永远逐行读取给定文件或直到收到“false”值,然后继续执行后续命令。

    参考:https: //linuxize.com/post/bash-while-loop/,http : //linuxcommand.org/lc3_man_pages/readh.html,https : //linuxhint.com/while_read_line_bash/,https : //pubs。 opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_09

  • do sudo apt-get install -y $p ;命令:

    命令元素 解释
    do 保留字用于分隔后面的命令序列。即开始
    apt-get Debian APT(高级软件包工具)软件包管理器使用的工具
    install 用于安装软件包的命令
    -y 长形式是--yes. 在所有查询提示中假设“是”
    $p 用于调用任意变量p并将read其用作标准输入

    以超级用户身份安装软件包列表,而不提示确认安装。

    参考: https: //itsfoss.com/apt-get-linux-guide/

  • done < <(cat << "EOF" <list of packages> EOF)命令:

    命令元素 解释
    done 保留字用于分隔前面的命令序列。即,停止
    < 重定向到标准输入
    cat 连接。用于查看、创建和附加文件
    << 重定向,从当前源读取输入,直到遇到分隔符,然后使用这些行作为命令的标准输入
    EOF 文件结束分隔符
    cat << EOF-EOF 这将读取并打印EOF块中包含的所有内容
    <(list) 获取列表的输出;括号表示该列表将在子 shell 环境中执行

    读取包列表并将它们收集为标准输入。将其重定向到read命令,该命令将其捕获为p变量,然后将其发送到$p变量,这允许它由命令执行install,并且当它到达EOF分隔符时,重定向输出以done有效结束while read循环。

    参考: https: //linuxhint.com/cat-command-bash/,https : //linuxhint.com/what-is-cat-eof-bash-script/

以下四个echo消息是不言自明的:

  • echo installing the nice-to-have pre-requisites
  • echo you have 5 seconds to proceed ...
  • echo or
  • echo hit Ctrl+C to quit

然而,下一个却不是。

  • echo -e "\n"命令:

    命令元素 解释
    -e 启用反斜杠字符功能
    \n 新行的反斜杠转义序列

    该命令创建一个换行符。

  • sleep 6命令:

    命令元素 解释
    sleep 延迟 bash 脚本的执行,通常延迟 N 秒,除非使用选项来指示更长的时间长度

    延迟执行以下命令 6 秒。

    参考:https: //linuxhandbook.com/bash-sleep/

  • sudo apt-get install -y tig命令:

    tig以超级用户身份运行安装时,使用 Debian工具安装软件包apt-get,并且不提示确认。

一般参考资料