Shell에서 단일 인용부호와 이중 인용부호의 차이

쉘 스크립트에서 문자열을 정의할 때, 일반적인 경우는 이중 인용부호(")를 사용하고, 변수 할당 시 등호(=) 뒤에 공백이 없어야 합니다. 강제로 내용을 그대로 유지하고 싶다면 단일 인용부호(')를 사용하며, 명령어의 결과를 포함시키고 싶다면 백틱(`) 또는 $() 구문을 활용합니다. - 단일 인용부호 ('): 내부 내용을 그대로 해석하지 않고, 출력 시 그대로 전달됩니다. 즉, 변수, 명령어, 이스케이프 문자가 모두 무시되고 원본 텍스트가 출력됩니다. 이는 '강한 참조'라고 불립니다. - 이중 인용부호 (" ): 내부의 변수, 명령 확장($()), 특수 문자 등을 먼저 해석한 후, 최종 결과를 출력합니다. 이는 '약한 참조'입니다. - 백틱 (`): 명령어 실행을 위한 구문으로, 명령의 출력 결과를 문자열로 대체합니다. $()와 동일한 기능을 하며, 변수 할당이나 출력 시 사용됩니다.
[root@localhost ~]# time=date
[root@localhost ~]# echo $time
date
[root@localhost ~]# time=`date`
[root@localhost ~]# echo $time
2019년 08월 01일 목요일 08:14:11 CST
[root@localhost ~]# time="`date`"
[root@localhost ~]# echo $time
2019년 08월 01일 목요일 08:21:15 CST
[root@localhost ~]# time='`date`'
[root@localhost ~]# echo $time
`date`
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo `$PATH`
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 그런 파일이나 디렉터리가 없습니다.
[root@localhost ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo '$PATH'
$PATH
[root@localhost ~]# time="지금은 베이징 시간:`date`"
[root@localhost ~]# echo $time
지금은 베이징 시간:2019년 08월 01일 목요일 08:24:25 CST
[root@localhost ~]# time='지금은 베이징 시간:`date`'
[root@localhost ~]# echo $time
지금은 베이징 시간:`date`
[root@localhost ~]# time="지금은 베이징 시간:\b`date`"
[root@localhost ~]# echo $time
지금은 베이징 시간:\b2019년 08월 01일 목요일 08:25:19 CST
[root@localhost ~]# time='지금은 베이징 시간:`date`'
[root@localhost ~]# echo $time
지금은 베이징 시간:`date`
[root@localhost ~]# time="우리는 모두\n좋은 아이다"
[root@localhost ~]# echo -e $time
우리는 모두
좋은 아이다
[root@localhost ~]# time='우리는 모두\n좋은 아이다'
[root@localhost ~]# echo -e $time
우리는 모두
좋은 아이다

단일 인용부호나 이중 인용부호 외에 직접 이스케이프 시퀀스를 처리하려면 echo -e를 사용해야 하며, 이는 인용부호 내에서도 이스케이프 문자를 해석할 수 있게 합니다. 다만, ""를 사용하지 않고도 일부 이스케이프가 가능할 수 있으나, 가독성과 예측 가능성 측면에서 항상 "를 사용해 문자열을 감싸는 것이 안전합니다.

태그: Shell scripting quoting variable expansion command substitution escape sequences

5월 27일 03:00에 게시됨