2013-05-23 2 views
14

bash 스크립트는 파일 이름 (또는 상대 경로)을 문자열로 수신하지만 그 파일에서 읽어야합니다. 스크립트에서 직접 리터럴로 선언하면 (따옴표 제외) 파일 이름을 읽을 수만 있습니다 ... 암시 적으로 문자열이기 때문에 인수로는 불가능합니다. 관찰 :bash : 문자열 변수를 파일 이름/경로로 해석하십시오.

a="~/test.txt" 
#Look for it 
if [[ -a $a ]] ; then 
    echo "A Found it" 
else 
    echo "A Error" 
fi 
#Try to use it 
while read line; do 
    echo $line 
done < $a 

b='~/test.txt' 
#Look for it 
if [[ -a $b ]] ; then 
    echo "B Found it" 
else 
    echo "B Error" 
fi 
#Try to use it 
while read line; do 
    echo $line 
done < $b 

c=~/test.txt 
#Look for it 
if [[ -a $c ]] ; then 
    echo "C Found it" 
else 
    echo "C Error" 
fi 
#Try to use it 
while read line; do 
    echo $line 
done < $c 

수율 : 위에서 언급 한 바와 같이, 나는 내가 인용 문자열을 얻을 같은 동작을 얻을 수 있기 때문에 위의 루틴에 명령 행 인수를 전달할 수 없습니다

A Error 
./test.sh: line 10: ~/test.txt: No such file or directory 
B Error 
./test: line 12: ~/test.txt: No such file or directory 
C Found it 
Hello 

.

+3

"~/test.txt"및 '~/test.txt'는 홈 디렉토리에 ~의 확장을 중지합니다. ~/test.txt는 인용 부호가 없기 때문에 작동합니다. ~ 표기법을 사용하지 않거나 따옴표를 사용하지 않으려면 .... –

+1

스크립트의 명령 행 인자 ('$ 1')를 사용하면 스크립트가 호출되기 전에 이미 홈 디렉토리 확장이 완료 되었기 때문에 모든 것이 잘 작동합니다. – rici

+0

@rici 예, 커맨드 라인이나 다른 스크립트에서 스크립트를 호출 할 때'~'는 따옴표로 묶이지 않아야합니다. 그의 스크립트가 다른 프로그램에서 호출되었을 때 다른 이야기입니다. 그것은 다른 프로그램에서 수정되어야하는 실수 일 것입니다. 그러나 그가 자신의 대본에서 그런 경우를 다루기를 원한다면 아마도 그는 '평가'가 필요할 것이다. – Uwe

답변

28

이것은 ~ -expansion의 규칙 중 일부입니다. Bash 매뉴얼에서이 확장은 ~이 인용 될 때 수행되지 않는다고 분명하게 명시되어 있습니다.

해결 방법은 1

~ 인용하지 마십시오.

file=~/path/to/file 

당신은 파일 이름의 나머지 인용해야하는 경우 : (이것은 정원 - 다양한 쉘에서 완벽하게 합법적이다.)

file=~/"path with spaces/to/file" 

해결 방법 2

사용 $HOME~ 대신.

file="$HOME/path/to/file" 

은 BTW :

쉘 변수 유형 당신은 쉘 변수의 유형에 대한 약간의 혼동이 될 것으로 보인다.

모든 것은 문자열입니다.

가라 앉을 때까지 반복하십시오. 모든 것이 문자열입니다. (정수를 제외하고,하지만 그들이있어 대부분 AFAIK 문자열의 맨 위에 해킹 및 배열,하지만 그들은 배열을 문자열의 이야..)

이 쉘 문자열입니다 "foo". "42"입니다. 따라서 42입니다. foo입니다. 따옴표를 붙일 필요가없는 경우에는 합리적이지 않습니다. 입력 할 사람 : "ls" "-la" "some/dir"?

+0

'file = ~ "/ 공백으로/경로/to/file"'도 작동하지 않습니다. 그것은 나를 위해 zsh에서 작동하며 bash에서 작동하지 않는'file = ~/"경로를 공백/to/file" – sercxjo

+1

@sercxjo로 작성해야합니다. 나는. '~ /''는 더 이식성이 좋습니다. –

+1

@sercxjo (및 Nick)이 수정되었습니다. – michaelb958