簡體   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