*nix에서 후행 ":"(콜론)은 무엇을 의미합니까? [폐쇄]

*nix에서 후행 ":"(콜론)은 무엇을 의미합니까? [폐쇄]

저는 현재 여기에 있는 쉘 스크립팅에 대한 튜토리얼을 따르고 있습니다. http://www.cs.columbia.edu/~sauce/tutorial/ashell.html나는 내 스크립트가 이 스크립트에 완벽하게 들어맞는다고 생각합니다. 그러나 예제를 실행하려고 하면 출력이 일치하지 않습니다. 모호하게 묻고 싶지 않고 "왜 작동하지 않습니까?"라고 묻고 싶지 않기 때문에 이해하지 못하는 부분에 집중하겠습니다. 명령 ":"뒤에 왜 가 있습니까 testlogin:? 나는 " : "(양쪽에 공백) 및 선행의 의미를 논의하는 많은 포럼을 읽었지만 ":"후행 콜론 사용에 대해서는 아무것도 읽지 않았습니다. 이 맥락에서 그것은 무엇을 의미합니까? 이것이 오타인 경우, 예제에서 제대로 작동하지 않을 수 있는 또 다른 오타를 찾는 데 도움을 줄 수 있는 사람이 있습니까?

어떤 도움이라도 대단히 감사하겠습니다!

코드(위에 링크한 웹사이트에서 정확히 복사함)는 다음과 같습니다.

#testlogin
useron(){
if ( who | grep $1 > /dev/null)
then echo $1 is logged in
else echo $1 is not logged in
fi 
}
if test $# != 1
then echo testlogin: username
else useron
fi

그리고 출력

paul@paul-LC22UP:~$ .testlogin paul
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
is no logged in

답변1

testlogin이것은 명령이 아니라 매개변수입니다 echo. 완전한 명령은 다음과 같습니다:

 echo testlogin: username

echoSTDOUT에 제공한 텍스트를 뱉어내기만 하면 됩니다. 따라서 콜론은 특별한 의미가 없으며 축어적 출력의 일부입니다 echo. 잘못된 수의 인수를 사용하여 스크립트를 호출하면 출력은 다음과 같습니다.

$ ./testlogin
testlogin: username
$ ./testlogin fred bill adam
testlogin: username

이는 이상한 출력이지만 반드시 오타는 아닙니다. 나는 보통 다음과 같은 것을 더 많이 기대합니다.

$ ./testlogin
Usage: testlogin username

전체 스크립트가 작동하지 않는 이유는 작성자가 useron함수를 호출할 때 미묘한 실수를 했고 아마도 게시하기 전에 스크립트를 테스트하지 않았기 때문입니다(아니면 작성자도 여러분과 동일한 실수를 발견했을 것입니다). 함수 $1useron첫 번째 매개변수입니다.그 기능에, 전체 스크립트가 아닌 useron인수 없이 호출되었으므로 빈 문자열이므로 결국 다음 명령이 실행됩니다.

$ who | grep

grep이는 s의 사용법 정보를 제공 한 다음 항상 else조건 분기를 트리거합니다. 다음과 같이 첫 번째 매개변수를 스크립트에 전달하여 이 문제를 해결할 수 있습니다 useron.

else useron $1

답변2

귀하가 연결한 웹사이트의 품질이 매우 낮습니다 shell scripts.
귀하의 질문에 미리 대답하자면, "후행 콜론"은 셸에 특별한 의미가 없으며 단지 화면에 인쇄되는 문자열의 일부일 뿐입니다.

그러나 페이지의 코드에는 다음과 같은 결함이 있습니다.

  • 당신이 배워야 할 가장 중요한 문제는 "확장 기능 인용"입니다.
    이것이 "매개변수 확장"(변수)이지만 다른 확장도 있습니다.
    이것이 제가 이 글을 쓴 주된 이유입니다. 확장명을 인용하지 않는 습관을 들이는 것은 매우 나쁜 습관입니다.

  • 언급되지 않은셰본 메커니즘페이지의 어느 곳에서나. (이것은 첫 번째 줄이 #!/bin/bash 또는 이와 유사하다는 것을 의미합니다.) 스크립트가 실행되는 쉘 유형을 지정하지 않고 스크립트를 작성하는 것은 오류와 문제의 확실한 원인입니다.

  • 11번째 줄에는 함수 호출을 위한 인수가 누락되었습니다. 다음 else useron "$1"과 같아야 합니다.else useron

이러한 세 가지 명백한 오류 후에 스크립트를 실행할 수 있습니다.

$ testlogin
testlogin: username

보시다시피, 10행의 문자열은 콘솔에 있는 그대로 인쇄됩니다.
후행 콜론은 :쉘에 아무런 의미가 없습니다. 이는 문자열이 다음과 같이 인용되면 명확해집니다.

then echo "testlogin: username"

실제로 IMO에서는 다음과 같이 더 명확하게 설명합니다.

then echo "A parameter is needed, type something like 'testlogin: username'"

이제 인수 없이 스크립트를 실행하면 유용한 답변이 인쇄됩니다.
사용자 이름을 작성할 수도 있습니다.

$ testlogin joe
joe is not logged in

위 변경을 수행하는 스크립트는 다음과 같습니다.

#/bin/sh
useron(){
    if    ( who | grep "$1" > /dev/null)
    then  echo "$1 is logged in"
    else  echo "$1 is not logged in"
    fi
}

if    test "$#" != "1"
then  echo "Parameter missing, type something like 'testlogin: username'"
else  useron "$1"
fi

이제 두 번째 질문은 다음과 같습니다.

  • 대부분의 쉘에서는 외부 test명령이 더 이상 사용되지 않습니다. 완전히 동등한 쉘 또는 보다 현대적인 쉘로
    대체되었습니다 . 스크립트에 사용된 행:은 다음으로 대체되어야 합니다.[[[if test "$#" != "1"

    if    [ "$#" != "1" ]
    
  • 이제 글쓰기 스타일에 대해 이야기해 보겠습니다. 현대에는 다음과 같은 스크립트를 작성하는 것이 더 일반적입니다(그러나 이는 개인 취향의 문제입니다).

#/bin/sh
useron(){
    if ( who | grep "$1" > /dev/null); then
        echo "$1 is logged in"
    else
        echo "$1 is not logged in"
    fi
}

if  [ "$#" != "1" ]; then
    echo "Parameter missing, type something like 'testlogin: username'"
else
    useron "$1"
fi

관련 정보