次のように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
パス名の間にスラッシュを追加するには、追加の定型句を使用してください。
答え2
間接変数拡張を使用することもできます。
$fpath=`echo $resource/operation`
echo ${!fpath}
これにより、fpath内のリソース値が拡張されます。
答え3
変数拡張は一度だけ発生し、再帰的ではありません。
値を直接拡張できます。
resource=/data/bscs
fpath='$resource/operation'
echo ${fpath/'$resource'/$resource}
eval
置き換えることができるすべての変数をコードにリストする必要があるため、これははるかに安全です。
答え4
なぜ人々がevalを嫌うのかわかりません。正しく使用すると問題は発生しません。
最も簡単な解決策は次のとおりです。
read -p "File Path: " FILE_PATH
FILE_PATH=$(eval echo $FILE_PATH)
編集:(説明)簡単に言えば、データがOSパスになることがわかっている場合は、使用する前に変数から拡張したことを確認してください。 evalの目的は、その中の可能なすべての値を評価することによってこれを行います。すべてのコマンドの前にそれを使用するのは悪夢です。コマンドで使用される変数に使用します。