如何在Bash脚本中提取PHP INI路径并添加imagick扩展?
解决你的Bash脚本问题
1. 正确提取php.ini的路径
你原来的变量赋值有两个小问题:一是没使用命令替换(需要用$()或反引号包裹执行命令),二是没过滤掉输出里的多余文本。
要只保留纯路径,推荐这两种简单的方法:
方法一:用awk提取最后一个字段
php -i的输出里,Loaded Configuration File => /path/to/php.ini的最后一段就是路径,用awk直接取最后一个字段:
INI_LOC=$(php -i | awk '/Loaded Configuration File/ {print $NF}')
方法二:用sed替换前缀文本
直接把Loaded Configuration File => 这部分替换为空,剩下的就是路径:
INI_LOC=$(php -i | grep 'Loaded Configuration File' | sed 's/^.*=> //')
执行后再echo $INI_LOC,就只会输出/etc/php/7.1/cli/php.ini了。
2. 向php.ini添加imagick扩展配置(仅当不存在时)
接下来需要先检查文件里是否已经有extension=imagick.so这一行,没有的话再追加。注意php.ini通常需要root权限修改,所以脚本最好用sudo运行,或者用tee命令配合sudo实现追加:
# 静默检查是否已存在目标配置行 if ! grep -q "^extension=imagick.so" "$INI_LOC"; then # 不存在则追加到文件末尾 echo "extension=imagick.so" | sudo tee -a "$INI_LOC" > /dev/null echo "Successfully added imagick extension config to $INI_LOC" else echo "Imagick extension is already configured in $INI_LOC" fi
这里用tee -a而不是直接>>,是因为echo ... >> file的重定向操作由当前用户执行,即使加了sudo也无法修改root权限的文件,而tee可以完美解决这个问题。
整合后的完整脚本片段
把这些修改整合到你的脚本里,最终版本大概是这样:
#!/bin/sh apt-get update # 获取最新软件包列表 apt-get install -y imagemagick ghostscript php-imagick # 加-y自动确认,同时安装php-imagick依赖包 # 提取php.ini路径 INI_LOC=$(php -i | awk '/Loaded Configuration File/ {print $NF}') # 检查并添加imagick扩展配置 if ! grep -q "^extension=imagick.so" "$INI_LOC"; then echo "extension=imagick.so" | sudo tee -a "$INI_LOC" > /dev/null echo "Added imagick extension to $INI_LOC" else echo "Imagick extension already exists in $INI_LOC" fi
补充说明:部分系统安装php-imagick后会自动配置extension,这一步检查可以确保在特殊场景下也能完成配置。
内容的提问来源于stack exchange,提问作者Ed Stephenson
相关产品推荐
相关产品推荐

