echo $(cal) 와 echo "$(cal)" 의 차이점

echo $(cal) 와 echo "$(cal)" 의 차이점

저는 Linux에서 echo $(cal)and를 사용하고 echo "$(cal)"있는데 그림과 같이 다른 결과가 나타납니다. $이 경우 큰따옴표가 방해해서는 안 되므로 와 echo "$(cal)"비교하여 가로 스타일을 제공하는 것은 무엇입니까 echo $(cal)?

결과는 다음과 같습니다.

출력 스크린샷

echo "$(cal)"

Su Mo Tu We Th Fr Sa  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30

echo $(cal)

June 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

답변1

두 가지 주요 차이점이 있습니다.

  1. 쉘이 수행하는단어 분리인용되지 않은 $(cal). 이는 의 기본값을 가정하면 IFS모든 공백 문자열(줄바꿈 포함)이 단일 공백으로 대체됨을 의미합니다. 따옴표가 없는 명령의 출력은 한 줄에 있습니다.

    다음은 더 간단한 예입니다.

    $ s='line     1
    > line  2'
    $ echo "$s"
    line     1
    line  2
    $ echo $s
    line 1 line 2
    

    보시다시피, echo큰따옴표가 없는 두 번째 에서는 모든 공백 시퀀스가 ​​단일 공백으로 대체되었습니다. 이것은 echo큰따옴표 없이 를 사용할 때 본 것과 같습니다 echo $(cal).

  2. 쉘이 수행하는경로명 확장단어 분할의 결과. 이는 예제에서 아무런 차이를 만들지 않지만 출력에 다른 전역 활성 문자가 포함되어 있으면 ?놀라운 *일이 발생할 수 있습니다.

    다음은 간단한 예입니다.경로명 확장. 세 개의 파일이 있는 디렉터리부터 시작해 보겠습니다.

    $ ls
    file1  file2  file3
    

    이제 문자열을 정의해 보겠습니다: $ s='file?'

    이제 echo큰따옴표를 사용하면 문자열을 반환하지만 큰따옴표가 없으면 문자열이 파일 이름으로 확장됩니다.

    $ echo "$s"
    file?
    $ echo $s
    file1 file2 file3
    

관련 정보