Bash
變數未在另一個變數 bash 中擴展
我正在讀取 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
使用一些額外的樣板在路徑名之間添加斜杠。