繁体   English   中英

Bash脚本-嵌套$(..)命令-无法正常工作

[英]Bash Script - Nested $(..) Commands - Not working correctly

我试图在一行上执行这几个操作/命令,并将其分配给变量。 除一部分外,我的工作方式大约占90%。

我不知道您可以这样做,但我读到您可以将$(..)嵌套在其他$(..)....中,所以我试图这样做以使此工作正常进行,但似乎无法获得剩下的一切。

所以基本上,我想做的是:
1.获取文件的输出并将其分配给变量
2.然后在输出的开头添加一些文本
3.然后在输出末尾附加一些文本
4.最后删除换行符,并用“ \\ n”字符替换它们。

我可以通过多个步骤很好地完成此操作,但我想尝试以这种方式进行操作。

到目前为止,我已经尝试了以下方法:

我的第一次尝试,是在阅读有关嵌套$(..)之前:

MY_VAR=$(echo -n "<pre style=\"display:inline;\">"; cat input.txt | sed ':a;N;$!ba;s/\n/\\n/g'; echo -n "</pre>")

除了在cat命令的输出和最后一个echo命令之间添加了换行符之外,这条命令的工作方式达到了99%。 我猜这是从cat命令来的,因为sed删除了除那一行以外的所有换行符,也许...?

其他尝试:

MY_VAR=$( $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo -n "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g')

MY_VAR="$( echo $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g' )"

MY_VAR="$( echo "$(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>")" | sed ':a;N;$!ba;s/\n/\\n/g' )"

*多数其他示例都尝试过在不同的$(..)部分之间使用多余的双引号...

我进行了几次其他尝试,但是它们也都没有运气...在上面的其他几次尝试中,它似乎奏效,只是sed没有插入它的替换部分。 输出在大多数情况下是正确的,除了没有看到两行之间的“ \\ n”,它只是显示了每一行都粉碎成一条线,没有任何分隔它们的地方。

我在想,如果有人有任何想法,我在这里会缺少一些小东西。

* PS Bash是否为$(..)结构命名? 很难尝试使用Google,因为它实际上并不搜索符号...

您无需在此处嵌套命令替换。

your_var='<pre style="display:inline;">'"$(<input.txt)"'</pre>'
your_var=${your_var//$'\n'/'\n'}

  • "$(<input.txt)"扩展为input.txt的内容,但没有任何结尾的换行符。 (命令替换总是删除结尾的换行符; printf '%s' "$(cat ...)"具有相同的效果,尽管效率较低,因为它需要一个子shell,而cat ...则没有。)
  • ${foo//bar/baz}扩展为名为foo的shell变量的内容,其中bar所有实例都替换为baz
  • $'\\n'是文字换行符的bash语法。
  • '\\n'是bash语法,用于两个字符的字符串,以反斜杠开头。
  • 因此,将所有这些联系在一起,首先会生成一个带有前缀,文件内容和后缀的字符串。 然后将合并字符串中的文字换行符替换为'\\ n'两个字符的序列。

诚然,这是如上所述的多行代码,但是它比任何涉及命令替换的东西都快得多,而且效率也更高。


但是,如果您确实想要单个嵌套的命令替换,则可以执行以下操作:

your_var=$(printf '%s' '<pre style="display:inline;">' \
                       "$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \
                       '</pre>')
  • printf %s组合了其参数,且参数之间没有任何定界符
  • sed操作在每行的末尾添加一个文字\\n ,除了最后一行
  • tr -d '\\n'操作从文件中删除文字换行符

但是,即使没有嵌套也可以更有效地完成此方法:

printf -v your_var '%s' '<pre style="display:inline;">' \
                        "$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \
                        '</pre>')

...具有printf的结果直接将其结果分配给your_var ,而无需任何外部命令替换(从而节省了外部子shell的开销)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM