#!/bin/bash
#
# useage:
# php-iniset key value
#
# sets php ini key to value
# if no value is supplied key will be commented
# If value is supplied key will automatically be commented out
#
key=$1
val=$2
scope=${3:-apache2}
version=`php -r "echo substr(PHP_VERSION, 0, 3);"`
filepath="/etc/php/$version/$scope/php.ini"
if [ -f $filepath ]
then
if [ -e $val ]
then
#disable if value is empty
sudo sed -i "/^$key =.*$/s/^/;/g" $filepath
#confirm disabled
grep "^;$key " $filepath
else
#enable if value has been supplied
sudo sed -i "/^;$key =.*$/s/^;//g" $filepath
#modify value
sudo sed -i "s,^$key =.*$,$key = $val," $filepath
#confirm value
grep "^$key " $filepath
fi
else
echo "$path does not exist"
fi
得到:
代替:
请注意,
php.ini
在运行之前创建备份是个好主意sed
:我假设您在
php.ini
每行存储一个值,并用=
有或没有周围空格分隔。变量名和值都不包含=
.要打印
post_max_size
值(选择一个):要将值更改为创建名为的备份:
post_max_size
2048M
php.ini.bak
解释
<php.ini awk -F"= *" '/^ *post_max_size/{print$2}'
<php.ini
– 让外壳打开php.ini
并将其分配给程序的标准输入,这有很多优点,请参见此处-F"= *"
– 设置=
后跟零个或多个空格字符作为字段分隔符/^ *post_max_size/{print$2}
– 从post_max_size
打印字段开始的行2
<php.ini sed '/^ *post_max_size/!d;s/.*= *//'
/^ *post_max_size/!d
-d
删除除以开头的那一行之外的每一行post_max_size
s/.*= *//
–s
将之前的所有内容=
和之后的零个或多个空格字符替换为空(= 删除它)<php.ini grep -oP '^ *post_max_size *= *\K.*'
-oP
– 仅打印o
匹配行的匹配部分并使用与P
erl 兼容的正则表达式 (PCRE)^ *post_max_size *= *\K.*
– 搜索以零个或多个空格字符开头post_max_size
并被=
零个或多个空格字符包围的行,然后从整个正则表达式匹配 (\K
) 中删除匹配的文本并匹配其后的所有内容sed -i.bak '/^ *post_max_size/s/=.*/= 2048M/' php.ini
-i.bak
- 更改文件i
n 使用扩展名进行备份.bak
/^ *post_max_size/…
– 在以 , 开头的行post_max_size
中…
s/=.*/= 2048M/
–s
替代品=
和之后的一切= 2048M
我编写了一个简单的 bash 脚本来实现 Arkadiusz Drabczyk 的答案。
该脚本自动检测 php 的活动版本。
该脚本假定您使用的是 apache2(您可以传递第三个参数来覆盖)。
我命名了该文件
php-iniset
并将其添加到我的 bin 目录之一。现在您可以致电:
或者这样调用它来注释掉变量:
您可能需要根据需要调整文件路径等内容
记得先备份你的ini文件!
这是脚本: