다음과 같이 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
, 하지만 다음 관리자가 귀하의 이름을 저주할 것입니다. 구문 분석된 데이터를 사용할 때 변수를 추가해 보셨나요, 아니면 사용할 때 변수를 확장해 보셨나요?만들다데이터?
파일이 이런 방식으로 생성되었다면, 생성자가 사악한 방식을 바꾸도록 설득하기 위해 몇 가지 [편집] 기술을 사용할 수는 없나요?
변화가 실제로 불가능하다면,~ 해야 하다가능한 변수를 제어합니다. 그렇지 않으면 스크립트가 input 과 같은 다양한 주입 공격에 취약해집니다 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의 목적은 그 안에 있는 가능한 모든 값을 평가함으로써 이를 수행합니다. 모든 명령 전에 이를 사용하는 것은 악몽일 뿐입니다. 명령에 사용되는 변수에 사용하십시오.