子 shell 是否使用此處的字串執行?

子 shell 是否使用此處的字串執行?

我正在嘗試更好地組織 bash 腳本作為重寫/重新組織的一部分,並想知道以下情況下的「最佳實踐」是什麼:

ymd=`echo "${NOEXT}" | egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-"`

或者

ymd=`egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-" <<< ${NOEXT}` 

我相信第一個版本,由於管道,創建了一個子外殼。第二個版本有這裡的字串嗎?我認為事實並非如此,但想驗證我的假設。

答案1

後者不會,您可以(粗略地)透過查看(在空閒系統上)PID 的增加來驗證 - 運行前者時,它會增加 2,而運行後者時,它只會增加 1。

但是,這是一個巴什主義,也許應該替換為此處的文檔:

ymd=`egrep -o -m 1 "\-20[0-9]{2}\-[0-9]{2}\-[0-9]{2}\-" <<EOF
${NOEXT}
EOF`

答案2

如果您可以使用bash並且不需要 POSIX 相容性,則可以進行正規表示式匹配,而無需使用對egrep.

[[ $NOEXT =~ -20[0-9]{2}-[0-9]{2}-[0-9]{2}- ]]
ymd=${BASH_REMATCH[0]}

相關內容