我正在编写shell脚本来检查“kernel.shmall”值。脚本的目的是如果kernel.shmall小于4194304那么它应该将值修改为4194304.如果kernel.shmall不存在文件/etc/system.conf那么它应该将值添加到文件kernel.shmall = 4194304 < / p>
if grep -o "kernel.shmall" /emblocal/sysctl.conf > /dev/null
then
oldvalue=$(grep -v '^#' /emblocal/sysctl.conf|grep kernel.shmall|sed 's/=/ /g'| awk '{ print $2}')
if [ $oldvalue -lt 4194304 ]
then
sed -i "s|\("kernel.shmall" *= *\).*|\14194304|" /emblocal/sysctl.conf
fi
else
echo "kernel.shmall=" >> /emblocal/sysctl.conf
sed -i "s|\("kernel.shmall" *= *\).*|\14194304|" /emblocal/sysctl.conf
fi
如果值小于4194304,则脚本正在运行,但如果不存在则不添加“kernel.shmall = 4194304”。你可以帮助我完成它吗?
答案 0 :(得分:1)
试试这个:
#!/bin/sh
oldvalue=$(sed '/^#/d;/kernel\.shmall/!d;s/^[^=]*= *//' /emblocal/sysctl.conf)
if [ "$oldvalue" ]; then
[ $oldvalue -lt 4194304 ] &&
sed -i '/kernel\.shmall/{s/=.*/= 4194304/}' /emblocal/sysctl.conf
else
echo "kernel.shmall = 4194304" >> /emblocal/sysctl.conf
fi
或者在AWK中更简洁:
f=$(mktemp)
awk -vn=kernel.shmall '
function max(a,b) {return a<b?b:a}
{
if ($1 == n) oldval = $3
else print
}
END {print n, "=", max(oldval, 4194304)}
' /emblocal/sysctl.conf > "$f" && cp "$f" /emblocal/sysctl.conf
rm "$f"