Bash:如何从数组中获取值以从中创建命令

Bash:如何从数组中获取值以从中创建命令

是否可以使用 bash 从配置文件中以下语法提供的数组中获取字符串?

|        | Version | PackageManager | Webserver | Database |
|--------|---------|----------------|-----------|----------|
| Centos | 7       | yum            | httpd     | mariadb  |
| Ubuntu | 14.04   | apt-get        | apache    | mysql    |

精确的":
在 bash 脚本 (bootstrap.sh) 中,我希望能够编写一行来安装诸如“./install.sh -webserver”之类的包,以根据服务器操作系统安装 httpd 或 apache。

要求
- 在 bootstrap.sh 中,我只需调用 ./install.sh -webserver",它包含检查哪个是当前服务器操作系统以及服务器操作系统是否受支持的逻辑
- 检查要安装的内容 (-webserver)
- 看起来进入转换表,为相关操作系统选择正确的包管理器和包名称
- 并返回 bootstrap.sh 中安装 httpd 所需的命令(yum install httpd)

我知道这看起来很奇怪,但非常感谢您的帮助。

答案1

如果我理解正确,您需要一个命令,该命令将操作系统作为输入,并通过阅读您显示的表格返回正确的安装命令。如果你的表确实是你所显示的格式,包括对人类来说漂亮但对机器无用的|-,你可以这样做来获取网络服务器:

awk -vOS="Centos" '$2==OS{print $6,"install",$8}' table 

对于数据库来说:

awk -vOS="Centos" '$2==OS{print $6,"install",$10}' table 

实际输出将是:

$ awk -vOS="Centos" '$2==OS{print $6,"install",$8}' table 
yum install httpd

$ awk -vOS="Centos" '$2==OS{print $6,"install",$10}' table 
yum install mariadb

$ awk -vOS="Ubuntu" '$2==OS{print $6,"install",$8}' table 
apt-get install apache

$ awk -vOS="Ubuntu" '$2==OS{print $6,"install",$10}' table 
apt-get install mysql

如果您的表格采用更简单的格式,例如:

         Version  PackageManager  Webserver  Database 
 Centos  7        yum             httpd      mariadb  
 Ubuntu  14.04    apt-get         apache     mysql    

上面的内容将变成:

awk -vOS="OS_NAME" '$1==OS{print $3,"install",$4}'
awk -vOS="OS_NAME" '$1==OS{print $3,"install",$5}'

因此,在您的脚本中,假设您将操作系统另存为$os并将选项传递(webserverdatabase)为$option,您可以执行以下操作:

case $option in
     "webserver")
         commmand=$(awk -vOS="$os" '$2==OS{print $6,"install",$8}' table ) ;;
      "database")
          command=$(awk -vOS="$os" '$2==OS{print $6,"install",$10}' table) ;;
esac

相关内容