次のように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|サンプル1.txt|$リソース/作業/
$ fname内で$ resourceを拡張したいと思います。代わりに、次のような出力を取得します。
FILENO: 3
FILENAME: sample1.txt
SOURCE PATH: $resource/operation
私は以下を試しました:
"${fpath}"
$(echo $fpath)
この目標をどのように達成できますか?
ベストアンサー1
あなたはそれを使用することができます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
パス名の間にスラッシュを追加するには、追加の定型句を使用してください。