Bash

變數未在另一個變數 bash 中擴展

  • August 5, 2021

我正在讀取 bash 腳本中的 csv 文件,如下所示:

resource='/data/bscs/'
while IFS='|'read seqid fname fpath 
do
   echo "FILENO:         $seqid"
   echo "FILENAME:       $fname"
   echo "FILE_PATH:    $fpath"                    
done < "report.csv"

我的 csv 文件具有以下值:

3|sample1.txt|$resource/操作/

我想要 $ resource to expand inside $ 名稱。相反,我得到了這個輸出:

FILENO:         3
FILENAME:       sample1.txt
SOURCE PATH:    $resource/operation

我嘗試了以下方法:

"${fpath}" $(echo $fpath)

我怎樣才能做到這一點?

你可以使用eval,但是下一個維護者會罵你的名字。您是否嘗試在使用解析數據時僅附加變數,或在創建數據時擴展變數?

如果文件是這樣創建的,你不能只使用一些

$$ redacted $$說服鼻祖改邪歸正的技巧? 如果改變實際上是不可能的,那麼你必須控制哪些變數是可能的。否則,您的腳本很容易受到各種注入攻擊,例如3|sample1.txt|$(rm --arr --eff /)/operation/. 由於您顯然可以控制它,因此您可以根據具體情況用它們的值對變數進行一些文字替換:

IFS='/' read -a pathnames <<< "$fpath"
for pathname in "${pathnames[@]}"
do
   if [ "${pathname::1}" = '$' ]
   then
       variable_name="${pathname:1}"
       printf '%s' "${!variable_name}"
   else
       printf '%s' "$pathname"
   fi
done

使用一些額外的樣板在路徑名之間添加斜杠。

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