저는 현재 여기에 있는 쉘 스크립팅에 대한 튜토리얼을 따르고 있습니다.
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
echo
STDOUT에 제공한 텍스트를 뱉어내기만 하면 됩니다. 따라서 콜론은 특별한 의미가 없으며 축어적 출력의 일부입니다 echo
. 잘못된 수의 인수를 사용하여 스크립트를 호출하면 출력은 다음과 같습니다.
$ ./testlogin
testlogin: username
$ ./testlogin fred bill adam
testlogin: username
이는 이상한 출력이지만 반드시 오타는 아닙니다. 나는 보통 다음과 같은 것을 더 많이 기대합니다.
$ ./testlogin
Usage: testlogin username
전체 스크립트가 작동하지 않는 이유는 작성자가 useron
함수를 호출할 때 미묘한 실수를 했고 아마도 게시하기 전에 스크립트를 테스트하지 않았기 때문입니다(아니면 작성자도 여러분과 동일한 실수를 발견했을 것입니다). 함수 $1
는 useron
첫 번째 매개변수입니다.그 기능에, 전체 스크립트가 아닌 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