是否可以使用 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
并将选项传递(webserver
或database
)为$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