专用代码块(这里是文档)。

专用代码块(这里是文档)。

问题

在 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

相关内容