다른 변수 bash에서 변수가 확장되지 않았습니다.

다른 변수 bash에서 변수가 확장되지 않았습니다.

다음과 같이 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의 목적은 그 안에 있는 가능한 모든 값을 평가함으로써 이를 수행합니다. 모든 명령 전에 이를 사용하는 것은 악몽일 뿐입니다. 명령에 사용되는 변수에 사용하십시오.

관련 정보