Bash의 평가 문자열 내부에 달러 기호

Bash의 평가 문자열 내부에 달러 기호

이름의 첫 번째 문자로 달러 기호(예:)가 포함 된 수백 개의 하위 디렉터리가 있으며 $각 디렉터리에 액세스해야 합니다. 이러한 하위 디렉터리의 이름은 바꿀 수 없습니다. bash 스크립트 기능은 각각에 액세스하려고 시도하고 (지금까지) 해당 경로를 에코합니다. 구성된 경로 문자열을 통해 이 작업을 수행한 다음 평가해 보세요.

인쇄된 줄은 예상대로 나타 cmd=${cmd}납니다 cmd=cd /rbyoko/c/$Ono.RCB. 그러나 eval 명령은 잘못 해석되어 $Ono.RCB( $Ono빈 var일 수 있음) 결과가 다음과 같습니다. 그런 다음 스크립트가 실행되는 위치에서 -bash: cd: /rbyoko/c/.BIN/: No such file or directory 다음 줄이 인쇄됩니다 .We are in /home/user

$내 질문: 실제로 원하는 하위 디렉터리에 성공적으로 액세스하려면 문자열을 평가(및/또는 이스케이프된 하위 디렉터리 사용)하려면 어떻게 해야 합니까 ?

이것은 내 기능입니다.

visit_tree_recbin()
{
            strings="cdhlotpw"
            MACHINE=`uname -a`
            PWD=`pwd`
            for i in $(seq 1 ${#strings})
            do
                c="${strings:i-1:1}"
                echo "Letter $i: $c"
                #build eval string to do: cd "/rbyoko/${c}/\$Ono.RCB/"
                x1="cd /rbyoko/${c}/"
                x2="\$"
                x3="Ono.RCB/"
                cmd="${x1}${x2}${x3}"
                echo "cmd=${cmd}"
                eval "${x1}${x2}${x3}"
                echo "We are in " `pwd`
            done
}

답변1

변수에 저장된 명령을 실행하지 마십시오(간단한 명령 이름 및/또는 경로가 아닌 경우) 올바르게 인용하지 않는 한(이는 지루하고 덜 견고한 코드가 될 수 있음) 흥미로운 방식으로 실패할 수밖에 없습니다.

귀하의 경우에는 이것으로 충분합니다

cd "/rbyoko/$c/\$Ono.RCB"

즉, 디렉토리 경로 이름을 인용하고 ( $c공백을 허용하기 위해) 이스케이프하십시오 $.

또는:

cd "/rbyoko/$c"/'$Ono.RCB'

즉, 쉘로부터 비트를 보호하려면 달러 기호로 비트를 작은따옴표로 묶으십시오.

귀하의 기능이 수정되었습니다:

visit_tree_recbin () {
    for dir in c d h l o t p w; do
            cd "/rbyoko/$dir"/'$Ono.RCB'
            printf 'We are now in %s\n' "$PWD"
    done
}

또는,

visit_tree_recbin () {
    for dirpath in /rbyoko/[cdhlotpw]/'$Ono.RCB'/; do
            cd "$dirpath"
            printf 'We are now in %s\n' "$PWD"
    done
}

차이점은 첫 번째 변형이 디렉토리 경로 이름을 생성하고 cd그 안으로 들어간다는 것입니다. 디렉터리가 없으면 실패할 수 있습니다.

두 번째 변형은 일치하는 파일 이름 와일드카드 패턴을 사용합니다.기존의목차. 패턴이 일치하는 항목이 있으면 성공합니다( 디렉토리에 들어갈 수 cd있는 권한이 있는 경우 ).cd

현재 작업 디렉토리의 경로 이름을 포함하는 변수가 bash유지되므로 여기서 사용할 필요가 없습니다 .PWDpwd

관련 정보