问题
在 bash 中,输出位于命令的 1 行上,因此在标签<pre>
中不起作用。html
log=`cat ../local/log/$(ls -t ../local/log | head -1 )`
echo '
<tr style="background-color: rgb(250,240,240);">
<td style="padding: 10px; text-align: center;"><pre>'$log'</pre></td>
</tr>
' > itf-check-article.html
我怎样才能将输出以经典方式逐行而不是一行输出到变量?
谢谢。
更新。
命令。
log=`cat ../local/log/$(ls -t ../local/log | head -1 )`; echo $log.
输出(1 行)。
Start of processing orders. 0 order(s) in this run. No orders in this run
但是这个命令向我显示了这个(有2行)。
itfstage@vm14258:~/sofimon$ cat ../local/log/UNIHOBBY_ITF_ORDERS.log
Start of processing orders. 0 order(s) in this run.
No orders in this run
itfstage@vm14258:~/sofimon$
答案1
当 Bash 变量包含多行并且您想要按echo
原样输出时,您需要"
在变量周围加上双引号 ( )。例如:
echo '
.......<pre>
'"$log"'
</pre>...
' > ...
如果你加上双引号,该echo
命令会将其视为单身的(其内容恰好包含多行字符串)参数。如果不使用双引号,则每当出现空白(空格、制表符、换行符等)时,字符串的内容就会(由 Bash)拆分为多个参数。
例如:
$ var='a b c'
$ echo $var
a b c
$ echo "$var"
a b c
注意,第一个echo
将获得三个参数('a'
,'b'
和'c'
),并通过用 分隔符输出它们单身的空间。第二个echo
将获取单个参数('a b c'
)并按原样输出。
答案2
您的预标记工作正常。您的问题是 $log 在一行中包含了 cat 的输出。我建议您不要尝试修复此问题,而是将此代码拆分为更简单的步骤。
首先,这一行:
log=`cat ../local/log/$(ls -t ../local/log | head -1 )`
太复杂了,因为它嵌套了两个命令替换,语法也不同。你今天可能明白了,但为什么不把它分成两个步骤,这样你或你的同事一年后就能明白了:
logfile=../local/log/$(ls -t ../local/log | head -1)
logtext=$(cat $logfile)
或者甚至更好(假设日志文件以 .log 结尾):
logfile=$(ls -t ../local/log/*.log | head -1)
logtext=$(cat $logfile)
现在您看到您刚刚将 $logile 的内容放入了 $logtext。您似乎想要在预标记之间输出 $logfile 的内容,就像它在文件中显示的那样。使用上面的简化命令,将其放入 $logtext 显然是一个不必要的额外步骤。只是cat
您希望它出现的文件。反引号或 $() 构造用于为一个命令提供从另一个命令的输出创建的参数。在这种情况下,这只会把一切都搞乱。
因此你可以这样做:
outputfile=itf-check-article.html
logfile=$(ls -t ../local/log/*.log | head -1)
echo '<tr style="background-color: rgb(250,240,240);">' > $outputfile
echo '<td style="padding: 10px; text-align: center;"><pre>' >> $outputfile
cat $logfile >> $outputfile
echo '</pre></td></tr>' >> $outputfile
或者简单地运行括号之间的命令()
来启动一个带有一个重定向语句的子shell:
outputfile=itf-check-article.html
logfile=$(ls -t ../local/log/*.log | head -1)
(
echo '<tr style="background-color: rgb(250,240,240);">'
echo '<td style="padding: 10px; text-align: center;"><pre>'
cat $logfile
echo '</pre></td></tr>'
) > $outputfile
答案3
专用代码块(这里是文档)。
#!/bin/bash
cat > itf-check-article.html <<PRE
<tr style="background-color: rgb(250,240,240);">
<td style="padding: 10px; text-align: center;"><pre>$(awk '{printf "%s<br/>",$0}' $(ls -td ../local/log/* | head -n 1))</pre></td>
</tr>
PRE
输出:
$ cat itf-check-article.html
<tr style="background-color: rgb(250,240,240);">
<td style="padding: 10px; text-align: center;"><pre>Start of processing orders. 0 order(s) in this run.<br/>No orders in this run<br/></pre></td>
</tr>
使用 += 运算符附加到变量。
#!/bin/bash
declare html
html+='<tr style="background-color: rgb(250,240,240);">\n'
html+='<td style="padding: 10px; text-align: center;"><pre>'
html+=$(awk '{printf "%s<br/>",$0}' $(ls -td ../local/log/* | head -n 1))
html+='</pre></td>\n'
html+='</tr>'
echo -e "$html" > itf-check-article.html