Bash 읽기 명령

Bash Read Command



친구를 읽거나 죽으십시오. 읽기 명령은 위치 매개변수 및 echo 명령만큼 중요합니다. 다른 방법으로 사용자 입력을 포착하고, 암호를 수락하고, 함수를 작성하고, 반복하고, 파일 설명자를 엿볼 수 있습니까? 읽어.

무엇을 읽습니까?

읽기는 줄의 내용을 변수로 읽는 bash 내장 명령입니다. 특수 쉘 변수 IFS에 연결된 단어 분할을 허용합니다. 주로 사용자 입력을 잡는 데 사용되지만 표준 입력에서 입력을 받는 기능을 구현하는 데 사용할 수 있습니다.







Bash 내장 명령 도움말 읽기

bash 스크립트에서 read 명령을 사용하는 방법에 대해 알아보기 전에 도움을 받는 방법이 있습니다. 여기에서 예제에서 다루려고 하는 설명과 함께 읽기 명령에 사용할 수 있는 모든 옵션이 표시되어야 합니다.



명령줄



돕다 읽다

산출





읽다:읽다 [-ers] [- 배열] [-d 공유] [-나는 텍스트] [-n 문자] [-N 문자]
[-p 프롬프트] [-t 시간 ​​초과] [-u fd] [이름 ...]

표준 입력에서 한 줄을 읽고나뉘다필드로.

표준 입력에서 한 줄을 읽거나파일기술자 FD
만약NS-유옵션이 제공됩니다. 라인은나뉘다필드로같이말로
분할하고 첫 번째 단어는 첫 번째 NAME에 할당되고 두 번째 단어는
단어를 두 번째 NAME에 할당하는 식으로 나머지 단어가 할당됩니다.
NS마지막이름. 발견된 캐릭터만~에 $IFS인식된다같이단어
구분자.

NAME이 제공되지 않으면 행읽다저장된다~에REPLY 변수.

옵션:
-에게배열 단어 할당읽다배열의 순차적 인덱스에
변수 ARRAY, 0에서 시작
-NS구분하다계속하다 ~까지DELIM의 첫 번째 문자는읽다, 꽤
개행보다
- Readline을 사용하여 라인을 얻습니다.~에대화형 쉘
-NS텍스트 사용 TEXT같이초기 텍스트~을위한읽기 라인
-N엔차르반품기다리지 않고 NCHARS 문자를 읽은 후
~을위한개행이지만 구분 기호를 존중합니다.만약보다 적은

NCHARS 문자는읽다구분 기호 앞에
-N엔차르반품정확히 NCHARS 문자를 읽은 후에만
EOF가 발생하거나읽다 타임스아웃, 무시
구분자
-NS프롬프트 앞에 후행 개행 없이 문자열 PROMPT를 출력합니다.
시도읽다
-NS~하다백슬래시가 모든 문자를 이스케이프하는 것을 허용하지 않습니다.
-NS~하다~ 아니다던졌다터미널에서 오는 입력
-NS시간 초과시각밖으로 그리고반품실패만약에게완벽한라인
입력이 아닙니다읽다TIMEOUT초 이내. 의 가치
TMOUT 변수는 기본 시간 초과입니다. TIMEOUT은 다음과 같습니다.
분수. TIMEOUT이0,읽다보고
시도하지 않고 즉시읽다모든 데이터, 반환
성공만만약지정된 위치에서 입력 가능
파일설명자. NS출구상태가 다음보다 큽니다.128
만약시간 초과
-유fd읽다~에서파일표준 입력 대신 설명자 FD

종료 상태:
NS반품파일 끝이 발생하지 않는 한 코드는 0입니다.읽다 타임스
(~에 어느 사례그것가 128보다 큼), 변수 할당 오류

사용자 입력 잡기

대화형 bash 스크립트는 사용자 입력을 포착하지 않고는 아무 것도 아닙니다. 읽기 내장은 bash 스크립트 내에서 사용자 입력을 포착할 수 있는 방법을 제공합니다.

입력 라인 잡기

입력 라인을 잡기 위해 읽기에는 NAME 및 옵션이 필요하지 않습니다. NAME을 지정하지 않으면 REPLY라는 변수를 사용하여 사용자 입력을 저장합니다.

명령

{
던졌다 -N '무언가를 입력하고 Enter를 누르십시오: ';
읽다;
던졌다당신이 입력${답장}
}

산출

무언가를 입력하고 Enter 키를 누릅니다.(개행)
당신은 무언가를 입력했습니다

입력 단어 잡기

입력 단어를 잡기 위해서는 -d 옵션이 필요합니다. 단어의 경우 -d를 공백으로 설정하고 '-d'로 읽습니다. 즉, 사용자가 스페이스바를 누르면 read가 단어와 함께 REPLY를 로드합니다.

-d 옵션이 설정되면 백스페이스가 예상대로 작동하지 않습니다. 백스페이스하려면 입력 단어를 잡으려고 시도하는 동안 -e 옵션을 사용할 수 있습니다. -e '-d'를 읽으십시오.

명령

{
던졌다 -N '무언가를 입력하고 공백을 누르십시오: ';
읽다 '-NS ';
던졌다 '';
던졌다 '입력하셨습니다.${답장}'
}

산출

무언가를 입력하고 공백을 누르십시오.(우주)
당신은 무언가를 입력했습니다

프롬프트 사용자

대화식 bash 스크립트에서 사용자에게 프롬프트를 표시하려면 사용자에게 예상되는 입력을 알려주는 메시지가 필요할 수 있습니다. echo 내장을 사용하여 항상 이를 수행할 수 있습니다. 그러나 읽기를 사용하는 옵션이 있는 것으로 나타났습니다.

사용자에게 단어 묻기

입력의 단어를 잡을 때 우리는 '-d'를 읽기 전에 표준 출력에 Type something과 hit space:를 쓰기 위해 echo를 사용했습니다. -p 옵션을 사용하면 표준 입력에서 읽기 전에 메시지를 표시할 수 있습니다.

명령

{
읽다 -NS '무언가를 입력하고 공백을 누르십시오: ' '-NS ';
던졌다 '';
던졌다 '입력하셨습니다.${답장}'
}

산출

무언가를 입력하고 공백을 누르십시오.(우주)
당신은 무언가를 입력했습니다

사용자에게 비밀을 묻는 메시지 표시

터미널에 표시되지 않고 사용자 입력을 잡을 때 -s 옵션이 유용합니다. read -s -p를 사용하면 다음과 같이 사용자 입력을 포착하고 숨길 수 있습니다.

명령

{
읽다 -NS -NS '비밀로 지키겠다고 약속한 내용을 입력하세요.'
던졌다 '';
던졌다 '당신의 비밀은 나와 함께 안전합니다';설정 해제댓글 ;
던졌다 '${답장}'
}

산출

비밀로 하기로 약속한 내용을 입력하세요.
당신의 비밀은 나와 함께 안전합니다

읽기를 사용하는 함수

다음은 읽기 및 표준 입력을 사용하는 bash의 함수 예입니다.

핵심 개념

읽기를 사용하는 함수는 파이프된 표준 입력 및 매개변수를 사용합니다. 파일의 행과 같이 처리할 주 입력은 파이프를 통해 표준 입력을 통해 전달됩니다. 기타 입력 if-any 및 옵션은 매개변수로 전달됩니다.

읽다 -NS 1NAME1 NAME2 ...

읽다이다내장 명령

-t 1 bash 스크립트가 표준 입력을 통해 반환되는 행을 무기한 대기하는 것을 방지합니다. 표준 입력이 처음에 비어 있으면 함수가 종료 코드 142와 함께 반환되어 설정된 시간 초과 기간 내에 날짜를 읽지 않았음을 나타냅니다.

NAME1 NAME2는 변수 이름입니다.

... 많은 변수 이름이 나열될 수 있습니다.

이제 기초가 설정되었으므로 읽기를 사용하여 구현된 친숙한 기능이 어떻게 보이는지 봅시다.

읽기를 사용한 조인 기능

단어 목록을 가져와서 구분 기호로 결합된 다른 단어 목록을 반환하는 조인 함수를 원한다고 가정합니다. 다음은 읽기를 사용하여 조인 기능을 구현하는 방법입니다.

스크립트

#!/bin/bash
## 가입하다
## 버전 0.0.2 - 재귀 매개변수 수정
###################################################
가입하다() { { 현지의리미터;리미터='$ {1-}';현지의구분자;
구분자='$ {2-.}';}
현지의자동차
현지의CDR
현지의IFS
IFS='${구분자}'
읽다 -NS 1자동차 CDR|| 반품
시험 '${cdr}' || { 던졌다 '${자동차}';반품;}
던졌다 '${자동차}${outdelimiter}${cdr}' | ${FUNCNAME} '${구분자}'
'${outdelimiter}'
}
###################################################
## create-stub2.sh v0.1.2에 의해 생성됨
## 2019년 6월 17일 월요일 12:24:59 +0900
## 보다
###################################################

원천: 조인.sh
명령줄

던졌다| 가입하다

산출

a.b

명령줄

던졌다| 가입하다 | 가입하다. |

산출

에게|NS

읽기를 사용하여 함수 매핑

목록을 가져와서 다른 함수에 의해 수정된 동일한 수의 요소를 포함하는 다른 목록을 반환하는 지도 함수가 필요하다고 가정합니다. 다음은 읽기를 사용하여 지도 기능을 구현하는 방법입니다.

스크립트

#!/bin/bash
## 지도
## 버전 0.0.1 - 초기
###################################################
지도() { { 현지의함수 이름 ;function_name='$ {1}';}
현지의자동차
현지의CDR
현지의IFS
IFS='${구분자- }'
읽다 -NS 1자동차 CDR|| 반품
시험 '$( -f ${function_name} 선언)' || 반품
시험 '${자동차}' || { 진실;반품;}
${함수 이름} ${자동차}
던졌다 '${cdr}' | ${FUNCNAME} '${함수 이름}'
}
###################################################
## create-stub2.sh v0.1.2에 의해 생성됨
## 2019년 6월 18일 화요일 08:33:49 +0900
## 보다
###################################################

원천: 지도.sh
명령

NS() { 현지의 -NS NS=$ {1};던졌다$((NS** 2 ));}
던졌다 {1..10} |맵 포

산출

1
4
9
16
25
36
49
64
81
100

읽기를 사용한 필터 기능

목록을 취하고 다른 함수에 의해 설정된 조건을 충족하는 요소의 하위 목록을 반환하는 필터 함수를 원한다고 가정합니다. 다음은 읽기를 사용하여 필터 기능을 구현하는 방법입니다.

스크립트

#!/bin/bash
## 필터
## 버전 0.0.1 - 초기
###################################################
필터() { { 현지의함수 이름 ;function_name='$ {1}';}
현지의자동차
현지의CDR
현지의IFS
IFS='${구분자- }'
읽다 -NS 1자동차 CDR|| 반품
시험 '$( -f ${function_name} 선언)' || 반품
시험 '${자동차}' || { 진실;반품;}
${함수 이름} '${자동차}' || 던졌다 -N '${자동차}'
던졌다 '${cdr}' | ${FUNCNAME} '${함수 이름}'
}
###################################################
## create-stub2.sh v0.1.2에 의해 생성됨
## 2019년 6월 18일 화요일 13:19:54 +0900
## 보다
###################################################

원천: 필터.sh

명령

이상한() { 현지의 -NS NS=$ {1};시험 !$((NS% 2 )) -eq 1;}
던졌다 {1..10} |이상한 필터

산출

1 5 7 9

읽기를 사용한 루프

읽기를 사용하는 루프를 사용하면 생성되거나 이미 존재하는 파일의 줄을 반복할 수 있습니다.

왼쪽에 대한 기본 while 읽기 루프(lhs)

read와 while 루프를 사용하여 루프할 수 있는 파일에 라인을 생성할 수 있는 명령 또는 함수(lhs)가 있습니다.

건설하다

ㄹㅇ| 동안 읽다
~하다
진실
완료
lhs는명령라인 목록을 반환하는

명령

시퀀스 5 | 동안 읽다NS
~하다
던졌다 ${i}
완료

산출

1
2

4
5

오른쪽(rhs)에 대한 기본 while 읽기 루프

read와 while 루프를 사용하여 루프할 수 있는 라인이 있는 파일(rhs)이 있습니다.

건설하다

동안 읽다
~하다
진실
완료 <rhs

rhs는파일포함 라인

명령

시퀀스 5 >rhs
동안 읽다NS
~하다
던졌다 ${i}
완료 <rhs

산출

1
2

4
5

읽기를 사용하는 사용자 지정 lhs while 루프

read를 사용하여 반복하려는 단어 스트림이 있습니다.

건설하다

(
IFS=''
ㄹㅇ| 동안 읽다
~하다
진실
완료
)

lhs는 단어 목록입니다.

명령

(
IFS=''
던졌다 {1..5} | 동안 읽다NS
~하다
던졌다 '${i}
완료
)

산출

1 2 4 5

표준 입력 대신 모든 fd에서 읽기

읽기 내장 옵션은 종종 손대지 않은 채로 남겨져 어떤 파일 디스크립터에서 읽을 것인지 지정할 수 있는 옵션입니다. read -u FD. 기본적으로 FD는 표준 입력으로 간주됩니다.

핵심 개념

파일을 열 때 파일 설명자가 할당됩니다. bash의 IO 리디렉션을 사용하면 파일을 특정 파일 설명자와 함께 열어 둘 수 있습니다. 우리는 파일에 쓰고, 읽고, 끝나면 닫을 수 있습니다.

_()
{
고양이 /개발자/없는>마이피포;# 빈 마이피포
간부 <마이피포;# myfifo 파일을 fd 3으로 엽니다.
던졌다 '안녕, 월드! - fd 3'에서 >마이피포;# myfifo에 쓰기
읽다 -유 ;# fd 3에서 행 읽기
간부 > &-;# 닫기 fd 3
던졌다 ${답장} # 닫기 전에 fd 3에서 읽은 출력 라인
}
_# 안녕하세요, 월드입니다! fd 3에서

파일 설명자와 read -u FD로 기차 만들기

그냥 재미로 파일 설명자로 기차를 만들고 -u FD를 읽기로 결정했습니다. 각 파일 설명자에는 번호가 기록됩니다. 각 파일 디스크립터는 아래 파일 디스크립터 1에서 읽고 자신에게 추가합니다.

명령줄

세게 때리다리눅스힌트닷컴/짓다/test-read-fd.sh 기차10

산출

fds 초기화 중...
fd 초기화...
fd초기화
fd 초기화4...
fd4초기화
fds 초기화
fd에서 읽기그리고4...
4
정리하기 전에 fds
0 1 2 4 5
청소 ...
fds 정리 중...
완료fds 정리
fds 정리 후
0 1 2

read -u FD를 사용하여 기능 건너뛰기

실행 중인 경우

우나메 -에게
밍그64_NT-10.0데스크탑-XVVVVVV 2.7.0(0.307/5/)
2017.-02-17 14:스물x86_64 엠시스
세게 때리다 --버전
암소 비슷한 일종의 영양세게 때리다, 버전 4.4.12(1)-풀어 주다(x86_64-pc-msys)

스크립트 소스를 읽기 전에 함수 외부의 bash 스크립트에서 다음 줄을 건너뛰는 건너뛰기 함수를 구현하는 버그로 인해 가능할 수 있습니다. 대부분의 시스템에서는 작동하지 않습니다. 예를 들어,

우나메 -에게
리눅스 4.9.0-8-amd64#1 데비안 SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/리눅스
세게 때리다 --버전
암소 비슷한 일종의 영양세게 때리다, 버전 4.4.12(1)-풀어 주다(x86_64-pc-linux-gnu)

스킵은 날지 않습니다.

기능

건너 뛰기() { 읽다 -유 31;}

명령

건너 뛰기
던졌다줄넘기
진실

산출

(비어있는)

결론

bash에 내장된 읽기는 사용자 입력을 잡는 것 이상을 수행합니다. bash 스크립트에서 사용되는 파일 설명자 간의 함수, 루프 및 교환에서 사용할 수 있습니다. 경우에 따라 읽기 및 파일 설명자를 사용하여 탐색하면 이스터 에그가 생성될 수 있습니다.