簡體   English   中英

Bash引用行為和sed

[英]Bash quote behavior and sed

我寫了一個簡短的bash腳本,它應該從字符串中去掉前導標簽/空格:

#!/bin/bash
RGX='s/^[ \t]*//'
SED="sed '$RGX'"
echo "       string" | $SED

它可以從命令行運行,但腳本會收到此錯誤:

sed: -e expression #1, char 1: unknown command: `''

我的猜測是引號有問題,但我不確定是什么。

確實如此。 嘗試:

#!/bin/bash
RGX='s/^[ \t]*//'
#SED='$RGX'
echo "       string" | sed "$RGX"

這有效。

你遇到的問題是引號和空格。 雙引號字符串作為單個參數傳遞。

set -x添加到腳本中。 您將看到單引號內的變量未展開。

將命令放入變量並將它們完整地取出是很困難的,因為引用不按預期方式工作(參見BashFAQ#050,“我試圖將命令放在變量中,但復雜的情況總是失敗!” )。 有幾種方法可以解決這個問題:

1)除非你真的需要,否則不要這樣做。 說真的,除非你有充分的理由將命令放在變量中,否則執行它並不處理這種混亂。

2)除非你真的 真的需要,否則不要使用eval eval作為令人討厭和模糊的錯誤的來源享有當之無愧的聲譽。 如果你足夠了解它們並采取必要的預防措施來避免它們,就可以避免它們,但這應該是最后的手段。

3)如果你真的必須在一個點定義一個命令並在以后使用它,要么將它定義為函數或數組。 以下是使用函數執行此操作的方法:

RGX='s/^[ \t]*//'
SEDCMD() { sed "$RGX"; }
echo "       string" | SEDCMD

這是陣列版本:

RGX='s/^[ \t]*//'
SEDCMD=(sed "$RGX")
echo "       string" | "${SEDCMD[@]}"

成語"${SEDCMD[@]}"允許您擴展數組,將每個元素保持為單獨的單詞,而不會出現任何問題。

+要擴展我上面的評論:

#!/bin/bash
RGX='s/^[[:space:]]+//'
SED="sed -r '$RGX'"
eval "printf \" \tstring\n\" | $SED"

請注意,這也使得你的正則表達式是一個擴展的,沒有特別的原因。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM