变量未在另一个变量 bash 内扩展

Men*_*non 6 bash shell-script variable-substitution variable

我正在 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"
Run Code Online (Sandbox Code Playgroud)

我的 csv 文件具有以下值:

3|sample1.txt|$资源/操作/

我希望 $resource 在 $fname 内扩展。相反,我得到了这个输出:

FILENO:         3
FILENAME:       sample1.txt
SOURCE PATH:    $resource/operation
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

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

我怎样才能做到这一点?

l0b*_*0b0 6

您可以使用eval,但下一个维护者会诅咒您的名字。您是否尝试过在使用解析数据时附加变量,或在创建数据时扩展变量?

如果文件是这样创建的,你不能用一些[编辑]技术来说服发起者改变他们的邪恶方式吗?

如果更改实际上是不可能的,那么您必须控制哪些变量是可能的。否则你的脚本很容易受到各种注入攻击,例如像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
Run Code Online (Sandbox Code Playgroud)

使用一些额外的样板在路径名之间添加斜杠。