Bash에서 변수로 작업하는 방법

0
559
노트북에 녹색 텍스트가있는 Linux 터미널.
Fatmawati Achmad Zaenuri / 셔터 스톡

스크립트를 작성하고 웹에서 잘라내어 붙여 넣을 코드가 Linux 컴퓨터에서 어떤 역할을하는지 이해하려면 변수가 중요합니다. 시작하겠습니다!

변수 101

변수는 문자열 또는 숫자 값을 나타내는 명명 된 기호입니다. 명령 및 표현식에서이를 사용하면 변수 이름 대신 보유한 값을 입력 한 것처럼 처리됩니다.

변수를 만들려면 이름과 값만 제공하면됩니다. 변수 이름은 설명 적이어야하며 보유한 값을 상기시켜야합니다. 변수 이름은 숫자로 시작하거나 공백을 포함 할 수 없습니다. 그러나 밑줄로 시작할 수 있습니다. 그 외에도 대문자와 소문자 영숫자를 혼합하여 사용할 수 있습니다.

여기서는 5 개의 변수를 만듭니다. 형식은 이름, 등호를 입력하는 것입니다 =, 그리고 가치. 등호 앞뒤에 공백이 없습니다. 변수에 값을주는 것을 종종 할당 변수의 값.

4 개의 문자열 변수와 1 개의 숫자 변수를 만들고 this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

터미널 창에 5 개의 변수가 있습니다.

변수에 보유 된 값을 보려면 echo 명령. 변수 이름 앞에 달러 기호를 붙여야합니다. $ 아래에 표시된대로 포함 된 값을 참조 할 때마다

echo $my_name
echo $my_boost
echo $this_year

"echo"명령은 터미널 창에 변수 값을 표시합니다.

모든 변수를 한 번에 사용합시다 :

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

터미널 창에서 $ his_boost가 $ him (c) $ this_year 인 경우 "echo"$ my_boost는 $ me입니다.

변수 값이 이름을 대체합니다. 변수 값을 변경할 수도 있습니다. 변수에 새로운 값을 할당하려면 my_boost다음과 같이 첫 번째 값을 지정할 때 수행 한 작업을 반복하면됩니다.

my_boost=Tequila

터미널 창의 "my_boost = Tequila"변수

이전 명령을 다시 실행하면 다른 결과가 나타납니다.

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

echo "$ my_boost는 $ mes에 $ mes_boost는 $ him (c) $ this_year"명령으로 터미널 창에 있습니다.

따라서 동일한 변수를 참조하는 동일한 명령을 사용하고 변수에 보유 된 값을 변경하면 다른 결과를 얻을 수 있습니다.

변수 인용에 대해서는 나중에 이야기하겠습니다. 지금은 기억해야 할 것이 있습니다.

  • 작은 따옴표로 묶은 변수 ' 변수가 아닌 리터럴 문자열로 취급됩니다.
  • 따옴표 안의 변수 " 변수로 취급됩니다.
  • 변수에 보유 된 값을 얻으려면 달러 기호를 제공해야합니다. $.
  • 달러 기호가없는 변수 $ 변수 이름 만 제공합니다.

터미널 창에서 변수를 참조하는 올바른 예와 올바르지 않은 예

기존 변수 또는 여러 변수에서 값을 가져 오는 변수를 작성할 수도 있습니다. 다음 명령은이라는 새 변수를 정의합니다 drink_of_the_Year, 그리고 그것의 결합 된 값을 할당 my_boostthis_year 변수:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

터미널 창에서 drink_of-the_Year = "$ my_boost $ this_year"명령

스크립트에서 변수를 사용하는 방법

변수가 없으면 스크립트가 완전히 방해 받게됩니다. 변수는 스크립트를 특정 솔루션이 아닌 일반적인 솔루션으로 만드는 유연성을 제공합니다. 차이점을 설명하기 위해 여기에 파일을 계산하는 스크립트가 있습니다. /dev 예배 규칙서.

이것을 텍스트 파일에 입력하고 다른 이름으로 저장하십시오. fcnt.sh (“파일 수”의 경우) :

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

스크립트를 실행하기 전에 아래와 같이 스크립트를 실행 가능하게 만들어야합니다.

chmod +x fcnt.sh

터미널 창에서 "chmod + x fcnt.sh".

스크립트를 실행하려면 다음을 입력하십시오.

./fcnt.sh

터미널 창에서 "./fcnt.sh".

이것은 파일의 수를 인쇄합니다 /dev 예배 규칙서. 작동 방식은 다음과 같습니다.

  • 라는 변수 folder_to_count “/ dev”라는 문자열을 유지하도록 설정되어 있습니다.
  • 또 다른 변수는 file_count가 정의되어 있습니다. 이 변수는 명령 대체에서 값을 가져옵니다. 이것은 괄호 사이의 명령 구문입니다 $( ). 달러 기호가 있습니다. $ 첫 번째 괄호 앞에. 이 구조 $( ) 괄호 안의 명령을 평가 한 다음 최종 값을 반환합니다. 이 예에서 해당 값은 file_count 변하기 쉬운. 까지 file_count 변수가 우려됩니다. 보유 할 값이 전달됩니다. 그 가치를 어떻게 얻었는지는 걱정하지 않습니다.
  • 명령 대체에서 평가 된 명령은 ls 디렉토리에있는 파일 목록 folder_to_count “/ dev”로 설정된 변수 따라서 스크립트는 “ls / dev”명령을 실행합니다.
  • 이 명령의 출력은 wc 명령. 그만큼 -l (행 수) 옵션은 wc 출력에서 라인 수를 계산합니다. ls 명령. 각 파일이 별도의 행에 나열되므로“/ dev”디렉토리에있는 파일 및 하위 디렉토리의 수입니다. 이 값은 file_count 변하기 쉬운.
  • 마지막 줄은 echo를 사용하여 결과를 출력합니다.

그러나 이것은 “/ dev”디렉토리에서만 작동합니다. 어떤 디렉토리에서 스크립트를 작동시킬 수 있습니까? 필요한 것은 하나의 작은 변화입니다.

스크립트에서 명령 줄 매개 변수를 사용하는 방법

다음과 같은 많은 명령 lswc명령 행 매개 변수를 사용하십시오. 이것들은 명령에 정보를 제공하므로 원하는 것을 알고 있습니다. 네가 원한다면 ls 홈 디렉토리에서 작업하고 숨겨진 파일을 표시하려면 다음 명령을 사용할 수 있습니다. ~ 그리고 -a (모두) 옵션은 명령 행 매개 변수입니다.

ls ~ -a

우리의 스크립트는 명령 행 매개 변수를 받아 들일 수 있습니다. 그것들은 $1 첫 번째 매개 변수의 경우 $2 두 번째로 $9 아홉 번째 매개 변수 (실제로 $0또한 스크립트를 항상 보유하도록 예약되어 있습니다.)

일반 변수와 마찬가지로 스크립트에서 명령 줄 매개 변수를 참조 할 수 있습니다. 아래와 같이 스크립트를 수정하고 새 이름으로 저장하겠습니다 fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

이번에는 folder_to_count 변수에는 첫 번째 명령 행 매개 변수의 값이 지정됩니다. $1.

나머지 스크립트는 이전과 동일하게 작동합니다. 특정 솔루션이 아니라 이제 스크립트가 일반적인 솔루션입니다. “/ dev”에서만 작동하도록 하드 코드되지 않았기 때문에 모든 디렉토리에서 사용할 수 있습니다.

스크립트를 실행 가능하게 만드는 방법은 다음과 같습니다.

chmod +x fcnt2.sh

터미널 창에서 "chmod + x fcnt2.sh".

이제 몇 개의 디렉토리로 시도하십시오. “/ dev”를 먼저 수행하여 이전과 동일한 결과를 얻을 수 있습니다. 다음을 입력하십시오.

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

터미널 창에서 "./fnct2.sh / dev".

“/ dev”디렉토리에 대해 이전과 동일한 결과 (207 개의 파일)를 얻습니다. 이것은 고무적이며 다른 명령 줄 매개 변수 각각에 대한 디렉토리 별 결과를 얻습니다.

스크립트를 줄이려면 변수를 생략하고 folder_to_count, 완전히, 그리고 단지 참조 $1 다음과 같이

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

특수 변수 작업

우리는 언급했다 $0이 파일은 항상 스크립트의 파일 이름으로 설정됩니다. 이렇게하면 이름을 바꾸더라도 스크립트를 사용하여 이름을 올바르게 인쇄하는 등의 작업을 수행 할 수 있습니다. 이는 항목을 추가 한 프로세스의 이름을 알고 싶은 로깅 상황에 유용합니다.

다른 특수 사전 설정 변수는 다음과 같습니다.

  • $ #: 스크립트에 전달 된 명령 행 매개 변수 수.
  • $ @: 모든 명령 행 매개 변수가 스크립트에 전달되었습니다.
  • $?: 마지막으로 실행 한 프로세스의 종료 상태입니다.
  • $$: 현재 스크립트의 프로세스 ID (PID).
  • $ USER: 스크립트를 실행하는 사용자의 사용자 이름입니다.
  • $ HOSTNAME: 스크립트를 실행하는 컴퓨터의 호스트 이름입니다.
  • $ SECONDS: 스크립트가 실행 된 시간 (초)입니다.
  • $ 랜덤: 난수를 반환합니다.
  • $ LINENO: 스크립트의 현재 줄 번호를 반환합니다.

하나의 스크립트로 모든 것을보고 싶습니까? 당신은 할 수 있습니다! 다음을 텍스트 파일로 저장하십시오. special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

다음을 입력하여 실행 가능하게하십시오.

chmod +x special.sh

터미널 창에서 "chmod + x special.sh".

이제 아래와 같이 다양한 명령 줄 매개 변수를 사용하여 실행할 수 있습니다.

터미널 창에서 "./special.sh alpha bravo charlie 56 2048 목요일"

환경 변수

Bash는 환경 변수를 사용하여 시작시 생성되는 환경의 속성을 정의하고 기록합니다. 이러한 사용자 이름, 로캘, 기록 파일이 보유 할 수있는 명령 수, 기본 편집기 등 Bash가 쉽게 액세스 할 수있는 정보를 보유합니다.

Bash 세션에서 활성 환경 변수를 보려면 다음 명령을 사용하십시오.

env | less

터미널 창의 "env | less"명령

목록을 스크롤하면 스크립트에서 참조하는 데 도움이 될 수 있습니다.

터미널 창에서 활성 환경 변수 목록.

변수를 내보내는 방법

스크립트가 실행되면 자체 프로세스에 있으며 해당 프로세스 외부에서 사용되는 변수를 볼 수 없습니다. 스크립트가 실행하는 다른 스크립트와 변수를 공유하려면 해당 변수를 내 보내야합니다. 두 가지 스크립트로이 작업을 수행하는 방법을 보여 드리겠습니다.

먼저 파일 이름으로 다음을 저장하십시오. script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

두 가지 변수가 생성됩니다. first_varsecond_var, 일부 값을 할당합니다. 이를 터미널 창에 인쇄하고 변수를 내보내고 호출합니다. script_two.sh. 언제 script_two.sh 종료하고 프로세스 플로우가이 스크립트로 리턴되면 변수를 다시 터미널 창에 인쇄합니다. 그런 다음 변경되었는지 확인할 수 있습니다.

우리가 사용할 두 번째 스크립트는 script_two.sh. 이것은 스크립트입니다 script_one.sh전화. 다음을 입력하십시오.

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

이 두 번째 스크립트는 두 변수의 값을 인쇄하고 새 값을 할당 한 다음 다시 인쇄합니다.

이러한 스크립트를 실행하려면 실행 가능하도록 다음을 입력해야합니다.

chmod +x script_one.sh
chmod +x script_two.sh

터미널 창에서 "chmod + x script_one.sh"및 "chmod + x script_two.sh"

이제 다음을 입력하여 시작하십시오. script_one.sh:

./script_one.sh

터미널 창에서 "./script_one.sh".

출력 결과는 다음과 같습니다.

  • script_one.sh 알파 및 브라보 변수의 값을 인쇄합니다.
  • script_two.sh 변수의 값 (알파 및 브라보)을받은대로 인쇄합니다.
  • script_two.sh 찰리와 델타로 변경합니다.
  • script_one.sh 여전히 알파와 브라보 변수의 값을 인쇄합니다.

두 번째 스크립트에서 발생하는 사항은 두 번째 스크립트에서 유지됩니다. 변수 사본이 두 번째 스크립트로 전송되는 것과 비슷하지만 스크립트가 종료되면 삭제됩니다. 첫 번째 스크립트의 원래 변수는 두 번째 스크립트의 사본에 발생하는 모든 것에 의해 변경되지 않습니다.

변수를 인용하는 방법

스크립트가 변수를 참조 할 때 따옴표 안에 있음을 알 수 있습니다 ". 이를 통해 변수를 올바르게 참조 할 수 있으므로 스크립트에서 행이 실행될 때 해당 값이 사용됩니다.

변수에 할당 한 값에 공백이 있으면 변수에 할당 할 때 따옴표로 묶어야합니다. 기본적으로 Bash는 공백을 구분 기호로 사용하기 때문입니다.

예를 들면 다음과 같습니다.

site_name=How-To Geek

터미널 창에서 "site_name = How-To Geek".

Bash는 “Geek”앞의 공백을 새로운 명령이 시작되고 있음을 나타냅니다. 그러한 명령이 없다고보고하고 회선을 포기합니다. echo 우리에게 site_name 변수에는 “How-To”텍스트조차 포함되지 않습니다.

아래와 같이 값 주위에 따옴표를 사용하여 다시 시도하십시오.

site_name="How-To Geek"

터미널 창에서 site_name = "How-To Geek"

이번에는 단일 값으로 인식되어 site_name 변하기 쉬운.

에코는 당신의 친구입니다

대체 명령, 변수 인용 및 달러 기호 포함시기를 기억하는 데 시간이 걸릴 수 있습니다.

Enter 키를 누르고 Bash 명령 줄을 실행하기 전에 echo 그것의 앞에. 이런 식으로, 당신은 무슨 일이 일어나고 있는지 원하는 것을 확인할 수 있습니다. 구문에서 실수했을 수도 있습니다.