Bash

使用 shell 腳本解釋從字元串中讀取的變數

  • May 31, 2019

我有一個文本文件,它通常填充多行,我想用 while 循環“列印”。此文件中的文本包含變數 - 我的問題是,這些變數的解釋與包含儲存在腳本中的變數的類似測試字元串不同。是否也可以從我的外部文件中解釋這些變數,或者我是否必須事先解析它們等?$LINE_INSIDE和 和有什麼不一樣$LINE_OUTSIDE?我嘗試了其他問題的一些建議,例如${!varialbe_name}帶有引號的不同結構,但到目前為止沒有運氣。

   #!/bin/bash
   # color.sh
   BLUE='\033[1;34m'
   NC='\033[0m' # No Color

   LINE_INSIDE="${BLUE}Blue Text${NC}"
   echo -e ${LINE_INSIDE}

   while read LINE_OUTSIDE; do
           echo -e ${LINE_OUTSIDE}
   done < text_file

輸出:

腳本的輸出

附加資訊:我(確實)在我的輸入文本文件中也有不應執行的 shell 命令。只有變數應該被擴展。

把它寫成這樣可能更有意義:

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color

eval "cat << EOF
$(<text_file)
EOF
"

而不是使用while read循環(順便說一句,這不是閱讀行的正確語法)。

當然,這意味著那裡的程式碼將被解釋。例如,其中的A$(reboot)會導致重新啟動,但這或多或少是您所要求的。

這也假設text_file不包含EOF一行。

另一種進行變數(環境變數)替換(而不是命令替換例如)的方法是使用 GNUgettextenvsubst

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst < text_file

或者只有這兩個變數被擴展:

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst '$BLUE$NC' < text_file

引用自:https://unix.stackexchange.com/questions/521174