我在shell脚本中有一个perl内联替换命令,由于某种原因它没有工作。使用以下命令,它取代所有":"在perl命令中使用替换字符串。
当我手动ssh到框并运行perl命令时,按预期工作。
<div class="header-container">
<header id="header">
{capture name='displayBanner'}{hook h='displayBanner'}{/capture}
{if $smarty.capture.displayBanner}
<div class="banner">
<div class="container">
<div class="row">
{$smarty.capture.displayBanner}
</div>
</div>
</div>
{/if}
{capture name='displayNav'}{hook h='displayNav'}{/capture}
{if $smarty.capture.displayNav}
<div class="nav">
<div class="container">
<div class="row">
<nav>{$smarty.capture.displayNav}</nav>
</div>
</div>
</div>
{/if}
<div>
<div class="container">
<div class="row">
<div id="header_logo">
<a href="{if isset($force_ssl) && $force_ssl}{$base_dir_ssl}{else}{$base_dir}{/if}" title="{$shop_name|escape:'html':'UTF-8'}">
<img class="logo img-responsive" src="{$logo_url}" alt="{$shop_name|escape:'html':'UTF-8'}"{if isset($logo_image_width) && $logo_image_width} width="{$logo_image_width}"{/if}{if isset($logo_image_height) && $logo_image_height} height="{$logo_image_height}"{/if}/>
</a>
</div>
{if isset($HOOK_TOP)}{$HOOK_TOP}{/if}
/*********************************************
HERE I'D LIKE TO DISPLAY THE HOMESLIDER MODULE
*********************************************/
<!--{if $page_name !='index' && $page_name !='pagenotfound'}
{include file="$tpl_dir./modules/homeslider/homeslider.tpl"}
{/if} -->
</div>
</div>
</div>
</header>
</div>
请注意,ssh host "cd /x/somedirectory && perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties"
和$somehost
不是shell变量。我正在寻找文字替代品。
我做错了什么?我尝试使用不同的分隔符,转义$someport
和{
等但仍然没有运气。
答案 0 :(得分:3)
要从字符串创建单引号shell文字,请使用'
替换它们来转义'\''
。
要从字符串创建双引号shell文字,请使用\
作为前缀"
,$
和\
。
您想要的Perl命令是
s#\${somehost}:\${someport}#10.20.30.40:8443#g
所以你想要的远程shell命令是
perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
所以你想要的本地shell命令是
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'
或
ssh host "perl -pi -e 's#\\\${somehost}:\\\${someport}#10.20.30.40:8443#g' config/app.properties"
[已移除cd /x/somedirectory &&
以简化操作。只需将其添加回来。]
答案 1 :(得分:2)
远程计算机上的shell将执行另一级别的转义。要在远程计算机上接收序列\$
,您必须发送序列\\\$
:
ssh host "cd /x/somedirectory && perl -pi -e
's#\\\${somehost}:\\\${someport}#10.20.30.40:8443#g' config/app.properties"
答案 2 :(得分:2)
所以,你可以写Perl ......
#!/usr/bin/perl
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host);
my $old = quotemeta("${somehost}:${someport}");
$ssh->system('cd', $some_directory, \\'&&',
'perl', '-pi', '-e',
"s|$old|10.20.30.40:8443|g",
'config/app.properties');
答案 3 :(得分:0)
使用here-doc尝试此ssh
命令并避免所有转义:
ssh -t -t host<<'EOF'
cd /x/somedirectory &&
perl -i -pe 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
exit
EOF