SW/리눅스

Linux : Bash : read 명령어, 사용 방법, 예제

얇은생각 2023. 1. 7. 07:30
반응형

Bash에는 명령줄 또는 셸 스크립트에서 사용할 수 있는 여러 가지 기본 제공 명령이 포함되어 있습니다.

내장된 읽기 명령에 대해 알아보겠습니다.

 

 

Linux : Bash : read 명령어, 사용 방법, 예제

 

 

Bash read 기본 제공

read는 표준 입력(또는 파일 설명자)에서 행을 읽고 해당 행을 단어로 분할하는 bash 기본 제공 명령입니다. 첫 번째 단어는 이름에 할당되고, 두 번째 단어는 두 번째 이름에 할당됩니다.

읽기 기본 제공의 일반 구문은 다음 형식을 사용합니다.

read [options] [name...]

 

 

명령의 작동 방식을 보려면 터미널을 열고 read var1 var2를 입력한 다음 "Enter"를 누릅니다. 명령은 사용자가 입력을 입력할 때까지 기다립니다. 단어 두 개를 입력하고 "Enter"를 누릅니다.

read var1 var2

# Hello, World!

 

 

단어는 인수로 read 명령어에 전달되는 이름에 할당됩니다. echo 또는 printf를 사용하여 확인합니다.

echo $var1
echo $var2

# Hello,
# World!

 

 

터미널에 입력하는 대신 파이프, here-string 또는 eredoc와 같은 다른 방법을 사용하여 읽을 표준 입력을 전달할 수 있습니다.

echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")

# Hello,
# World!

 

 

read 및 echo는 괄호로 묶이고 동일한 하위 셸에서 실행됩니다.

다음은 here 문자열과 printf를 사용한 예입니다.

read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"

# Var1: Hello, 
# Var2: World!

 

 

read 명령에 인수가 제공되지 않으면 전체 라인이 REPLOY 변수에 할당됩니다.

echo "Hello, world!" | (read; echo "$REPLY")

# Hello, World!

 

 

읽기에 제공된 인수 수가 입력에서 읽은 단어 수보다 클 경우, 나머지 단어는 성에 할당됩니다.

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")

# Var1: Linux 
# Var2: is awesome.

 

 

그렇지 않은 경우, 인수 수가 이름 수보다 작으면 나머지 이름에 빈 값이 할당됩니다.

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")

# Var1: Hello, 
# Var2: World! 
# Var3:

 

 

기본적으로 읽기에서는 백슬래시를 이스케이프 문자로 해석하여 예기치 않은 동작이 발생할 수 있습니다. 백슬래시 이스케이프를 사용하지 않으려면 -r 옵션을 사용하여 명령을 호출합니다.

다음은 -r 옵션을 사용하거나 사용하지 않고 호출할 때 읽기가 작동하는 예를 보여 줍니다.

read <<< "Hello, \tWorld!"
printf %s "$REPLY"

# Hello, tWorld!

 

 

read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"

# Hello, \tWorld!

 

 

일반적으로 읽기는 항상 -r 옵션과 함께 사용해야 합니다.

 

 

 

구분 기호를 변경

읽기의 기본 동작은 하나 이상의 공백, 탭 및 새 줄을 구분 기호로 사용하여 행을 단어로 분할하는 것입니다. 다른 문자를 구분 기호로 사용하려면 IFS 변수(내부 필드 구분 기호)에 해당 문자를 할당합니다.

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")

# Linux 
# is 
# awesome.

 

 

IFS를 공백 또는 탭 이외의 문자로 설정하면 단어는 정확히 한 문자로 구분됩니다.

echo "Linux::is:awesome." | \
  (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
  
# Var1: Linux 
# Var2:  
# Var3: is 
# Var4: awesome.

 

 

그 줄은 네 단어로 구분되어 있습니다. 두 번째 단어는 구분 기호 사이의 세그먼트를 나타내는 빈 값입니다. 두 개의 구분 기호 문자(::)를 서로 옆에 사용했기 때문에 만들어집니다.

둘 이상의 구분 기호를 사용하여 선을 분할할 수 있습니다. 구분 기호를 여러 개 지정할 경우 구분 기호 사이에 공백 없이 IFS 변수에 문자를 할당합니다.

다음은 _과 -를 구분 기호로 사용하는 예입니다.

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")

# Linux 
# is 
# awesome.

 

 

 

프롬프트 문자열

대화형 bash 스크립트를 작성할 때 read 명령을 사용하여 사용자 입력을 가져올 수 있습니다.

프롬프트 문자열을 지정하려면 -p 옵션을 사용합니다. 읽기가 실행되기 전에 프롬프트가 인쇄되며 새 줄은 포함되지 않습니다.

다음은 간단한 예입니다.

read -r -p "Are you sure?"

 

 

일반적으로 잠시 동안 루프 내에서 읽기 명령을 사용하여 사용자가 예상 응답 중 하나를 제공하도록 합니다.

아래 코드는 사용자에게 시스템을 재부팅하라는 메시지를 표시합니다.

while true; do
    read -r -p "Do you wish to reboot the system? (Y/N): " answer
    case $answer in
        [Yy]* ) reboot; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer Y or N.";;
    esac
done

 

 

셸 스크립트가 사용자에게 암호와 같은 중요한 정보를 입력하도록 요청하는 경우 터미널에서 입력을 인쇄하지 않도록 읽기를 지시하는 -s 옵션을 사용합니다.

read -r -s -p "Enter your password: "

 

 

 

배열에 단어를 할당

변수 이름 대신 단어를 배열에 할당하려면 -a 옵션을 사용하여 read 명령을 호출합니다.

read -r -a MY_ARR <<< "Linux is awesome."

for i in "${MY_ARR[@]}"; do 
  echo "$i"
done

# Linux 
# is 
# awesome.

 

 

배열과 변수 이름이 모두 지정되면 모든 단어가 배열에 할당됩니다.

읽기 명령은 입력 행을 단어로 분할하는 데 사용됩니다.

반응형