
수업 마감일이 있는데 '경외감'에 대해 아무것도 찾을 수 없나요?
과제에는 "Because Linux is Awesome!"이라는 단어를 에코하는 'awe'라는 함수가 포함된 스크립트를 생성하라는 내용이 나와 있습니다. 3번 질문 후.
저는 이 모든 것을 처음 접했고 정말 도움을 받고 싶습니다. 나는 노력했지만 awk
비디오에서 본 것에서 이것이 그가 원하는 것이 아니라는 것을 알았습니다. 감사해요.
답변1
Bash 셸을 사용하여 응답합니다.
과제에는 "Because Linux is Awesome!"이라는 단어를 에코하는 'awe'라는 함수가 포함된 스크립트를 생성하라는 내용이 나와 있습니다. 3번 질문 후.
과제에는 함수를 생성하라는 내용이 나와 있으니, 무엇인지 살펴보겠습니다.배쉬 매뉴얼우리에게 말해줍니다기능:
셸 함수는 그룹에 대한 단일 이름을 사용하여 나중에 실행할 수 있도록 명령을 그룹화하는 방법입니다. 이는 "일반" 명령처럼 실행됩니다. 쉘 함수의 이름을 단순 명령 이름으로 사용하는 경우 해당 함수 이름과 연관된 명령 목록이 실행됩니다. 쉘 기능은 현재 쉘 컨텍스트에서 실행됩니다. 이를 해석하기 위한 새로운 프로세스가 생성되지 않습니다.
함수는 다음 구문을 사용하여 선언됩니다.
name () compound-command [ redirections ]
또는
function name [()] compound-command [ redirections ]
이는 다음과 같은 쉘 함수를 정의합니다.이름. 예약어는
function
선택사항입니다. 예약어가 제공 되면function
괄호는 선택 사항입니다. 그만큼몸함수 중 복합 명령은 다음과 같습니다.복합 명령(보다복합 명령). 해당 명령은 일반적으로목록{ 및 } 사이에 포함되지만 위에 나열된 모든 복합 명령일 수 있습니다. 단, 한 가지 예외는 다음과 같습니다.function
예약어가 사용되었지만 괄호가 제공되지 않은 경우 중괄호가 필요합니다.복합 명령언제든지 실행됩니다이름명령 이름으로 지정됩니다.
간단히 말해서, 함수는 사용자가 제공한 특정 이름, 즉 함수 이름으로 묶인 명령 집합입니다.
할당은 함수 이름 지정 방법( awe
)과 이 함수가 수행할 작업("Because Linux is Awesome!" 출력)을 알려줍니다. 해당 메시지를 출력하려면 를 사용할 수 있습니다 echo
. echo
Bash가 쉘 내장으로 제공하는 명령은 다음으로 출력하는 데 사용됩니다 .stdout
(콘솔). 이 정보를 바탕으로 함수를 작성할 수 있습니다.
awe(){
echo "Because Linux is Awesome!"
}
다음 과제는 세 가지 질문을 한 후 실행하도록 하는 것입니다. 이를 위해 여러 옵션 플래그를 허용할 수 있는 명령을 사용할 수 있습니다 read
. 무엇인지 보자배쉬 매뉴얼우리에게 말해~에 대한read
:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]
표준 입력 또는 파일 설명자에서 한 줄을 읽습니다.fd 옵션 에 대한 인수로 제공되며
-u
위에서 설명한 대로 단어로 분할됩니다.단어 분할, 첫 번째 단어가 첫 번째 단어에 할당됩니다.이름, 두 번째 단어부터 두 번째 단어까지이름, 등등. 이름보다 단어가 더 많으면 나머지 단어와 그 사이의 구분 기호가 마지막 단어에 할당됩니다.이름. 입력 스트림에서 읽은 단어 수가 이름보다 적은 경우 나머지 이름에는 빈 값이 할당됩니다. 변수 값의 문자는IFS
쉘이 확장을 위해 사용하는 것과 동일한 규칙을 사용하여 행을 단어로 분할하는 데 사용됩니다(위의 설명 참조).단어 분할). 백슬래시 문자 '\
'는 다음 문자 읽기 및 줄 연속에 대한 특별한 의미를 제거하는 데 사용될 수 있습니다. 이름이 제공되지 않으면 read 행이 변수에 할당됩니다REPLY
.
read
몇 가지 옵션을 허용합니다. 이 경우 사용자에게 질문을 하고 그에 대한 입력을 받으려고 하기 때문에 두 가지가 가장 관련성이 높습니다. 해당 옵션은 다음과 같습니다.
-r
→ 이 옵션을 지정하면 백슬래시가 이스케이프 문자로 작동하지 않습니다. 백슬래시는 줄의 일부로 간주됩니다. 특히, 백슬래시-개행 쌍은 줄 연속으로 사용될 수 없습니다.-p prompt
→ 디스플레이즉각적인, 입력을 읽으려고 시도하기 전에 후행 줄 바꿈 없이. 프롬프트는 터미널에서 입력이 들어오는 경우에만 표시됩니다.
이것이 망각할 수 있는 최악의 상황은 아니지만 , 이스케이프 문자로 작동하는 것을 -r
방지하기 위해 거의 항상 이를 포함하고 싶어합니다 . 사용자에게 프롬프트를 표시합니다. 단일 뒤에 두 옵션을 모두 넣을 수 있으므로 다음과 같이 작성할 수 있습니다.\
-p
-
read -rp "Question? " variable
사용자의 입력은 에 저장되었습니다 variable
. 아니요, 우리는 사용자에게 다시 출력하는 문장에 입력을 포함하여 해당 입력을 사용하고 싶습니다. variable
보유하는 가치로 확장하려면 $
앞에 를 넣으세요. 이는 큰따옴표 내에서도 작동합니다.
echo "This is a reply to the user and it contains $variable!"
일반적으로 이것이 이 과제를 해결하는 데 필요한 전부입니다. 내 예제 스크립트에서는 if
마지막 질문에 대해 "예" 또는 "아니요"라고 답했는지 여부에 따라 조치를 취하는 조건을 사용하기 위해 약간의 변형을 추가했습니다 . 그럼 다시 한번 볼까요매뉴얼이 if
조건 에 관해 우리에게 말하는 것:
명령 구문은 다음
if
과 같습니다.if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
그만큼테스트 명령목록이 실행되고 반환 상태가 0이면결과 명령목록이 실행됩니다. 만약에테스트 명령0이 아닌 상태를 반환하면 각
elif
목록이 차례로 실행되고 종료 상태가 0이면 해당 목록이더 많은 결과실행되고 명령이 완료됩니다. ' '가 존재하고 최종 또는 절의 마지막 명령이 0이 아닌 종료 상태를 갖는 경우else alternate-consequents
if
elif
대체 결과실행됩니다. 반환 상태는 마지막으로 실행된 명령의 종료 상태이거나, true로 테스트된 조건이 없으면 0입니다.
test-command
아래 예에서 사용한 것은 조건부 [
참 또는 거짓을 테스트하는 내장 쉘입니다. 를 사용할 때는 [
최종 인수를 전달해야 합니다 ]
. =
변수가 문자열인지 테스트합니다.
예제 스크립트는 다음과 같습니다.
#!/bin/bash
# function 'awe' to output "Because Linux is Awesome!"
awe(){
echo "Because Linux is Awesome!"
}
# asking three questions
read -rp "Enter your name!: " name
echo "Well, hello then $name!"
read -rp "How old are you?: " age
echo "Being $age makes you nearly as old as I am"
read -rp "Do you like Linux?: " likes_linux
# acting on if the last input is yes or something else in which case we assume no
if [ "$likes_linux" = "yes" ];then
awe
else
echo "Why don't you like Linux?"
fi