이 변수가 있습니다.
toto=123456
왜 touch "$toto.hihi.log"
작동하고 다음과 같은 파일을 생성합니까?123456.hihi.log
그런데 touch "$totohihi.log"
아무 일도 일어나지 않았나요?
답변1
당신은해야합니다
touch "${toto}hihi.log"
문제는 중괄호가 없으면 쉘이 변수 이름에 몇 개의 문자가 있는지 알 수 없다는 것입니다. 따라서 모든 유효한 문자를 이름의 일부로 간주합니다. 이 경우에는 이전의 모든 것입니다 .
. 즉, 쉘은 존재하지 않는 변수를 사용합니다 $totohihi
.
일반적으로 쉘 옵션을 사용하여 무슨 일이 일어나고 있는지 확인하는 데 -x
도움이 됩니다 .
set -x
touch "$totohihi.log"
+ touch .log
답변2
그렇습니다. $totohihi
빈 문자열로 확장된 다음 실행됩니다 touch ".log"
(변수가 다른 곳에 설정되지 않았다고 가정). ls -l .log
무슨 말인지 보려고 노력하십시오 .
다른 답변에서 언급했듯이 다음 문자가 변수 이름의 일부일 수 있는 경우 변수 이름을 중괄호로 묶어야 하므로 touch "${toto}hihi.log"
변수 이름의 문자 및 숫자와 함께 밑줄도 유효하므로 "${toto}_hihi.log"
중괄호도 필요합니다.
답변3
$totohihi.log
이름이 있는 변수를 나타냅니다.totohihi
작동하게 하려면 다음을 사용하세요.
${toto}hihi.log
답변4
쉘은 이것이 $toto
값이 123456
.인 변수라는 것을 알고 있습니다.
따라서 찾을 때마다 $toto
로 대체합니다 123456
.
따라서 의 경우 $toto.hihi.log
쉘은 as를 연결 연산자로 대체 $toto
하고 예상대로 파일을 생성합니다. 123456
.
그러나 의 경우 $totohihi.log
쉘은 이름이 지정된 변수를 찾을 수 없으므로 $totohihi
이를 빈 문자열로 대체하여 파일을 생성합니다 .log
. 시작하는 파일 ls -a
이나 숨겨진 파일이므로 간단한 명령을 사용하여 볼 수 없는 파일이 있을 수 있습니다 . ls .log
.
ls
name이라는 파일을 생성해야 한다면 123456hihi.log
다른 사람들이 이전 답변에서 언급한 것처럼 $toto
중괄호를 넣어야 합니다.${toto}hihi.log