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)
我怎样才能做到这一点?
您可以使用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)
使用一些额外的样板在路径名之间添加斜杠。