변수를 소문자로 사용해야합니다 (가장 좋습니다).
FILENAME과 EXTENSION 대신 파일 이름과 확장자를 사용하겠습니다.
"파일 이름을 파일에서 읽습니다"라고 말하면 스크립트는 다음과 같다고 가정합니다.
read -r filename <file.txt
extension=World.txt
그리고 변수 $ filename과 $ extension을 밑줄로 연결하려고합니다 _
.
제공하는 예제 (더블 \ 없음 제외)는 다음과 같이 올바르게 작동합니다.
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
다른 사람으로서 :
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
따라서 문제는 변수가 어떻게 붙어 있는지가 아니라 var의 내용과 관련이 있습니다. 이것을 생각하는 것이 합리적입니다.
read -r filename <file.txt
\r
Windows 파일에서 읽을 경우 후행 캐리지 리턴을 읽습니다 .
간단한 해결책 (ksh, bash, zsh)은 읽기 변수에서 모든 제어 문자를 제거하는 것입니다.
filename=${filename//[[:cntrl:]]/}
이것은 캐리지 리턴이있는 값으로 시뮬레이션 할 수 있습니다.
$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end
또는 다음 값을 대체하십시오 filename
.
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
결론.
그래서 이건:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
name
다른 var에 제어 문자가 포함되어 있어도 올바른 값을 얻습니다 .