【发布时间】:2015-08-13 19:31:48
【问题描述】:
我写了一个我认为可以在一堆机器上运行的快速脚本。相反,它会打印递归搜索中的目录内容:
version=$(mysql Varnish -B --skip-column-names -e "SELECT value FROM sys_param WHERE param='PatchLevel'" | sed -n 's/^.*\([0-9]\.[0-9]*\).*$/\1/p')
if [[ $(echo "if($version == 6.10) { print 1; } else { print 0; }" | bc) -eq 1 ]]; then
status=$(dpkg-query -l | awk '{print $2}' | grep 'sg-status-polling');
cons=$(dpkg-query -l | awk '{print $2}' | grep 'sg-consolidated-poller');
if [[ "$status" != "" && "$cons" != "" ]]; then
echo "about to change /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm"; echo;
cp /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm.bkup;
sed -ir '184s!\x91\x93!\x91\x27--timeout=35\x27\x93!' /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm;
sed -n 183,185p /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm; echo;
else
echo "packages not found. Assumed to be not applicable";
fi
else
echo "This is 4.$version, skipping";
fi
该脚本应该确保 Varnish 是 4.6.10 版本并安装了 2 个自定义 .deb 包(不是通过 apt-get)。然后进行备份并编辑 perl 模块中从 [] 到 ['--timeout=35'] 的单行
它看起来像是在 sed replace one liner 上绊倒了。
【问题讨论】:
-
你的脚本有大量的外部依赖。请尝试将其减少为minimal complete verifiable example。谢谢。
-
另外,第一个
if条件过于复杂,猴子补丁系统 Perl 代码似乎非常不准确。 -
if是不是打算说if [ $version == 6.10 ]; then ...; else ...; fi?我还建议使用grep -q来测试您的包是否存在(如果没有更合适的方法)。 -
你确定
\x91\x93是你需要的吗?这似乎错过了我的方括号。使用sed -ri'.bkup' 's!\[\]!\[\x27--timeout=35\x27\]!' foo似乎对我有用... -
所以...没有人见过 sed 命令打印出随机垃圾,那我一定是疯了吗?