이름의 첫 번째 문자로 달러 기호(예:)가 포함 된 수백 개의 하위 디렉터리가 있으며 $
각 디렉터리에 액세스해야 합니다. 이러한 하위 디렉터리의 이름은 바꿀 수 없습니다. 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
유지되므로 여기서 사용할 필요가 없습니다 .PWD
pwd