웹사이트 검색

쉘 스크립팅 파트 2: 입력 수락 및 쉘 산술 수행


이 페이지에서

  1. Linux의 변수
  2. 환경 변수\n
    1. 환경 변수 값 변경\n

    1. 셸 변수 명명 규칙
    2. read 명령을 사용하여 쉘 변수에 값 할당:\n
    3. 쉘을 사용하여 간단한 산술 수행\n

    안녕! 이 문서는 Howtoforge 셸 스크립팅 자습서 시리즈의 두 번째 부분입니다. 지금까지 여러분이 시리즈의 첫 번째 부분을 읽었고 간단한 스크립트를 만들고 실행하는 방법을 알고 있다고 가정합니다. 두 번째 부분에서는 사용자의 입력을 수락하고 셸 스크립팅을 통해 처리하는 방법을 알아봅니다. 시작하자!

    리눅스의 변수

    프로그래밍 언어와 마찬가지로 Linux 셸에는 변수에 데이터를 저장할 수 있는 기능이 있습니다. 변수는 프로그래밍 언어를 통해 처리될 데이터를 임시로 저장하는 컨테이너입니다. Linux에는 환경 변수와 쉘 변수라는 두 가지 유형의 변수가 있습니다.

    환경 변수

    환경 변수는 Linux의 기본 변수이며 셸의 프로세스 간에 정보를 전달하는 데 사용됩니다. 환경 변수는 대소문자를 구분하며 액세스하려면 항상 대문자로 표시해야 합니다.

    아래 표는 Linux 셸의 일반적인 환경 변수를 보여줍니다.

    Variable name Usage
    BASH Holds the full path of the command interpreter for Bash scripts
    BASH_VERSION Holds the bash release version of the machine currently used
    HOME Holds the relative path of the home directory.
    LOGNAME Holds the account name of the current user logged-in
    OSTYPE Holds a string that describes the current OS of the machine used
    PATH Holds a colon-separated absolute path of the executable files in Linux
    PWD Holds the current working directory of the shell
    SHELL Holds the preferred command line shell
    USER Works similar to LOGNAME. It holds the account name of the user currently logged-in
    _ Holds the name of the recently used command in the shell

    환경 변수의 값을 표시하려면 사용자는 액세스할 변수 앞에 달러 기호($)를 추가해야 합니다. 예를 들어 현재 작업 디렉토리, 로그인한 사용자 및 echo를 사용하는 OS 유형과 같은 일부 시스템 정보를 표시하려면 다음을 사용합니다.

    #!/bin/bash
    echo $PWD
    echo $LOGNAME
    echo $OSTYPE

    결과는 다음과 같습니다.

    Linux에서 전체 환경 변수 목록을 얻으려면 env 명령을 사용하십시오.

    환경 변수 값 변경

    시스템 유연성을 제공하기 위해 이러한 환경 변수를 조작할 수 있습니다. 환경 변수에 값을 설정하려면 할당 표현식(등호)을 사용합니다.

    예:

    #!/bin/bash
    echo $USER
    USER="new user"
    echo $USER

    스크립트의 결과는 다음과 같습니다.

    스크립트를 실행하면 처음에 echo $USER 행의 $USER에 USER 변수의 값이 표시됩니다. 할당 연산자(=)를 사용하여 USER 변수는 해당 값을 변경합니다. 그러나 사용자가 알 수 없는 값을 환경 변수에 할당하면 셸은 스크립트의 로컬 컨텍스트에서 환경 변수와 유사한 다른 셸 변수를 생성하지만 다른 응용 프로그램의 동작에는 영향을 미치지 않습니다. 즉, 스크립트가 닫히면 USER 변수는 기본값을 유지합니다.

    이전 예에서 USER="new user" 줄과 같은 환경 변수의 값을 조작할 때 변수 이름에서 달러 기호($)를 생략했습니다. 또한 할당 연산자를 사용할 때 USER와 = 기호 사이에 공백이 없어야 합니다. 사이에 공백을 추가하면 오류가 발생합니다.

    쉘 변수

    쉘은 또한 사용자가 변수를 선언할 수 있도록 합니다. PHP와 마찬가지로 쉘 스크립트에서 변수를 선언하기 위해 사용자는 데이터 유형 선언에 대해 걱정할 필요가 없습니다. 인터프리터는 런타임 중에 사용자가 저장한 데이터를 기반으로 변수 데이터 유형을 자동으로 감지합니다.

    쉘 변수 명명 규칙

    모든 프로그래밍 언어와 마찬가지로 쉘 변수 이름 지정 규칙이 있습니다. 다음은 규칙을 요약한 것입니다.

    1. 변수 이름은 문자나 밑줄로 시작해야 합니다.\n
    2. 영숫자 문자 또는 밑줄만 포함해야 합니다.\n
    3. 변수는 대소문자를 구분하므로 변수 path, PATH 및 Path는 서로 다릅니다.\n

    이 규칙을 증명하기 위해 아래에 간단한 스크립트를 작성합니다.

    #!/bin/bash
    12abc=10
    abc#*=10
    _abc=10
    _ABC=2
    echo $12abc $abc#* $_abc $_ABC

    2행과 3행은 변수 12abc가 숫자 문자로 시작하고 변수 abc#*에 잘못된 문자가 포함되어 있기 때문에 "command not found" 오류를 반환합니다. 또한 _abc와 _ABC가 서로 다른 변수이며 _ABC=2 행이 _abc의 값을 무시하지 않는다는 것도 증명했습니다.

    읽기 명령을 사용하여 쉘 변수에 값 지정:

    read는 사용자의 입력을 허용하는 명령입니다. 읽기 명령을 사용하는 구문은 다음과 같습니다.

    read <variable_name>

    예를 들어 사용자가 이름과 성을 입력하고 표시할 수 있는 스크립트를 만들 것입니다. 사용자에게 수행할 작업을 알리기 위해 echo 명령으로 사용자 프롬프트를 표시합니다.

    #!/bin/bash
    echo "Your first name: "
    read fname
    echo "Your last name:"
    read lname 
    echo "Hello $fname $lname ! I am learning how to create shell scripts."

    결과는 다음과 같습니다.

    이전 예에서와 같이 변수를 사용하기 위해 변수를 선언할 필요가 없습니다. 또한 인터프리터는 읽기 명령에 사용되는 변수를 자동으로 생성합니다. 그러나 예제에서는 반복적으로 echo 명령을 사용하여 사용자에게 프롬프트를 생성했습니다. 읽기 명령에는 사용자 입력을 수락하는 동안 프롬프트를 만드는 기능도 있습니다. 읽기 명령에서 프롬프트를 사용하는 구문은 다음과 같습니다.

    read -p "Your prompt: " <variable_name>

    이전 코드를 단순화하기 위해 코드를 다음과 같이 재구성할 수 있습니다.

    #!/bin/bash
    read -p "Your first name: " fname
    read -p "Your last name: " lname
    echo "Hello $fname $lname ! I am learning how to create shell scripts"

    읽기 명령의 또 다른 이점은 명령 프롬프트가 아래 행이 아니라 텍스트 바로 뒤에 있다는 것입니다.

    읽기 명령을 사용하여 암호를 수락할 수도 있습니다. 일반 입력과 달리 암호는 보안을 위해 마스킹됩니다. 암호를 수락하는 구문은 다음과 같습니다.

    read -s -p "your prompt" <variable_name>

    쉘을 사용하여 간단한 산술 수행

    입력을 받아들이고 출력을 표시하는 것 외에도 bash 셸에는 내장 산술 옵션도 있습니다. 아래 표에는 Bash 셸의 내장 산술 연산자가 요약되어 있습니다.

    Operator Description Syntax Usage
    + Addition a=$((b+c)) Adds the value of b and c and stores it to variable a
    - Subtraction a=$((b-c)) Subtracts the value of c from b and stores it to variable a
    * Multiplication a=$((b*c)) Multiplies the value of b and c and stores it to variable a
    / Division a=$((b/c)) Divides the value of b by c and stores it to the variable a
    % Modulus a=$((b%c)) Performs modulo division of b and c and stores it to variable a
    ++ Pre-increment $((++aa)) Increments the value of variable a immediately
    ++ Post-increment $((a++)) Increments the value of variable a and reflect changes to the next line
    -- Pre-decrement $((--a)) Decrements the value of variable a immediately
    -- Post-decrement $((a--)) Decrements the value of variable a and reflect changes to the next line
    ** Exponentiation $((a**2)) Raise the value of a to the exponent of 2
    += Plus equal $((a+=b)) Adds the value of a and b and stores it to the variable a
    -= Minus equal $((a-=b)) Subtracts the value of b from a and stores it to the variable a
    *= Times equal $((a*=b)) Multiplies the value of a and b and stores it to variable a
    /= Slash equal $((a/=b)) Divides the value of a by b and stores it to the variable a
    %= Mod-equal $((a%=b)) Perform modulo division between a and b and stores it to variable a

    산술 명령을 수행할 때마다 모든 변수는 달러 기호와 이중 괄호로 묶입니다. 이를 통해 인터프리터는 변수 값을 정수로 취급합니다. 이것이 없으면 인터프리터는 변수 값을 문자열로 취급합니다. 예를 보려면 아래 스크립트를 참조하세요.

    #!/bin/bash
    read -p "Enter int1: " a
    read -p "Enter int2: " b
    echo $((a+b))
    c=$a+$b
    echo $c

    예제를 실행할 때 &#36 ((a+b)) 행은 변수 a와 b에 각각 저장된 사용자 값을 추가하는 반면 c=$a+$b는 변수 a와 b를 문자열로 취급합니다.

    결론

    입력을 받아들이고 변수에 저장하는 방법과 bash 셸 스크립팅에서 산술 연산을 수행하는 방법을 다루었습니다. 다음 부분에서는 제어 구조, 특히 의사결정 구조에 대해 다룰 것입니다.

    참조:

    리눅스 정보 프로젝트. (2007). 2015년 4월 29일 Linfo.org에서 검색함: http://www.linfo.org/

    Cooper, M. (n.d.). 고급 Bash 스크립팅 가이드. 2015년 4월 29일에 http://www.tldp.org/LDP/abs/html/에서 검색함

    환경 변수. (n.d.). Ubuntu 설명서에서 2015년 4월 29일 검색: https://help.ubuntu.com/community/EnvironmentVariables