将多行回显到文件中

adi*_*ya 5 bash echo

我有一个共享托管服务器的httpd.conf文件,我有一个任务是将每个虚拟主机迁移到vps.使用awk我为特定站点提取了一个虚拟主机条目块.并将该条目存储在变量中.但是当我回显变量的输出来附加vps服务器的httpd.conf时,它给出了一个错误

bash:命令替换:第1行:意外令牌newline' bash: command substitution: line 1:回显附近的语法错误'

任何人都可以通过回显一个具有多行的变量来判断附加简单文本文件的确切方法.

我期望的脚本如下:

#!/usr/bin/expect 
set remote_ip [lindex $argv 0] 
set username [lindex $argv 1] 
set remote_command [lindex $argv 2] 
foreach {remote_ip username remote_command} $argv {break} 
spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip `echo $remote_command >> /etc/httpd/conf/httpd.conf`
expect "*assword: " 
send "redhat\r" 
interact 
Run Code Online (Sandbox Code Playgroud)

变量"remote_command"包含虚拟主机条目的模式.使用printf但仍存在同样的问题. -


我的remote_command包含以下值

<VirtualHost>
DirectoryIndex index.php
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

它仍然给出相同的错误.我使用了""引号,但它适用于单行,而不适用于多行.

我的主脚本script.sh包含行

#!/bin/bash
some code .....
some code......
some code ......
echo "<VirtualHost $D_IPADDRESS>" > /opt/remotehttpd_conf
awk "p && /\/VirtualHost/{exit} /$SITENAME/{p=1}p" /opt/httpd.conf >> /opt/remotehttpd_conf
echo "</VirtualHost>" >> /opt/remotehttpd_conf
REMOTE_COMMANDS4=`cat /opt/remotehttpd_conf`
echo $REMOTE_COMMANDS4
./expect_remote_command_httpd.exp  "$D_IPADDRESS" "$USERNAME" "$REMOTE_COMMANDS4"
some code .....
some code .....
Run Code Online (Sandbox Code Playgroud)

当我回显REMOTE_COMMANDS4它工作正常并给我输出所以我使用expect_remote_command_httpd.exp将输出传输到远程机器

我的expect_remote_command_httpd.exp包含

#!/usr/bin/expect 
set remote_ip [lindex $argv 0] 
set username [lindex $argv 1] 
set remote_command [lindex $argv 2] 
foreach {remote_ip username remote_command} $argv {break} 
spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip `echo $remote_command >>   /etc/httpd/conf/httpd.conf`
expect "*assword: " 
send "redhat\r" 
interact 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.可能是我使用的方法是完全错误的.我主要关注的是提取与共享httpd服务器中给定站点相关的所有虚拟主机块行,并将其转发到远程vps的httpd conf文件.如果您建议任何其他方式,我将不胜感激.

sna*_*ssr 28

cat >> /path/to/existingFile.text<< EOF
some text line 1
some text line 2
some text line 3
EOF
Run Code Online (Sandbox Code Playgroud)

切换cat >>cat >创建文件而不是追加

cat > /path/to/newFile.text<< EOF
some text line 1
some text line 2
some text line 3
EOF
Run Code Online (Sandbox Code Playgroud)


Igo*_*bin 13

看起来你试图编写一些由特殊字符处理的字符.你必须逃避他们''.如果你只想添加线条line1,line2,line3seprated用换行尝试

echo -e 'line1\nline2\nline3\n'
Run Code Online (Sandbox Code Playgroud)

或(更便携)

printf 'line1\nline2\nline3\n'
Run Code Online (Sandbox Code Playgroud)

如果有别的,你能否提供更多信息?

感谢您提供更多信息.你改变反引号` to double quotes"" in thespawn ssh`命令.这是命令替换,但必须是普通(插值)字符串.

更新

好的,所以你想运行$remote_command并将其reuls写入文件.好.那你必须这样做:

spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip $remote_command >> /etc/httpd/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

  • `echo -e`是非常不便携的.使用`printf`. (2认同)