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
.
"~/test.txt"및 '~/test.txt'는 홈 디렉토리에 ~의 확장을 중지합니다. ~/test.txt는 인용 부호가 없기 때문에 작동합니다. ~ 표기법을 사용하지 않거나 따옴표를 사용하지 않으려면 .... –
스크립트의 명령 행 인자 ('$ 1')를 사용하면 스크립트가 호출되기 전에 이미 홈 디렉토리 확장이 완료 되었기 때문에 모든 것이 잘 작동합니다. – rici
@rici 예, 커맨드 라인이나 다른 스크립트에서 스크립트를 호출 할 때'~'는 따옴표로 묶이지 않아야합니다. 그의 스크립트가 다른 프로그램에서 호출되었을 때 다른 이야기입니다. 그것은 다른 프로그램에서 수정되어야하는 실수 일 것입니다. 그러나 그가 자신의 대본에서 그런 경우를 다루기를 원한다면 아마도 그는 '평가'가 필요할 것이다. – Uwe