Linux 시작을 위한 9가지 Bash 스크립트 예제

0
122
노트북 화면의 Linux 터미널입니다.
Fatmawati achmad zaenuri/Shutterstock.com

Linux에서 Bash 스크립팅을 시작하는 경우 기본 사항을 확실히 이해하면 오히려 도움이 될 것입니다. 그것들은 더 깊은 지식과 더 높은 스크립팅 기술의 기초입니다.

스크립트를 실행 가능하게 만드십시오.

셸에서 스크립트를 실행하려면 스크립트에 실행 파일 권한이 설정되어 있어야 합니다. 이것이 없으면 스크립트는 텍스트 파일일 뿐입니다. 그것으로, 그것은 여전히 ​​텍스트 파일이지만 쉘은 명령이 포함되어 있음을 알고 스크립트가 시작될 때 실행을 시도합니다.

스크립트 작성의 요점은 스크립트가 실행된다는 것이므로 첫 번째 기본 단계는 스크립트가 실행 가능한 것으로 간주되어야 함을 Linux에 알리는 방법을 아는 것입니다.

그만큼 chmod 명령을 사용하면 파일 권한을 설정할 수 있습니다. 실행 권한은 +x 플래그로 설정할 수 있습니다.

chmod +x script1.sh

스크립트를 실행 가능하게 만들기

각 스크립트에 대해 이 작업을 수행해야 합니다. “script1.sh”를 스크립트 이름으로 바꿉니다.

1. 그 이상한 첫 번째 줄은 무엇입니까?

스크립트의 첫 번째 줄은 해당 스크립트를 실행하기 위해 호출되어야 하는 인터프리터를 쉘에 알려줍니다. 첫 번째 줄은 해시뱅(hashbang)이라고도 하는 셰뱅(#!)으로 시작해야 합니다. “#!” 스크립트가 작성된 인터프리터의 경로와 이름이 이 행에 포함되어 있음을 쉘에 알립니다.

이것은 Bash에서 실행할 스크립트를 작성한 경우 다른 쉘에서 해석되는 것을 원하지 않기 때문에 중요합니다. 호환되지 않을 가능성이 있습니다. Bash는 대부분의 셸과 마찬가지로 다른 셸에는 없거나 다르게 구현했을 고유한 구문과 기능을 가지고 있습니다.

스크립트를 실행하면 현재 셸이 스크립트를 열고 해당 스크립트를 실행하는 데 사용해야 하는 셸이나 인터프리터를 결정합니다. 그런 다음 해당 셸을 시작하고 스크립트를 전달합니다.

#!/bin/bash

echo Running in $SHELL

이 스크립트의 첫 번째 줄은 “이 스크립트를 실행하려면 /bin/bash에 있는 인터프리터를 사용하십시오.”로 읽을 수 있습니다.

스크립트의 유일한 줄은 $SHELL 터미널 화면에 환경 변수. 이것은 Bash가 스크립트를 실행하는 데 사용되었음을 확인합니다.

./script1.sh

스크립트가 실행 중인 셸 식별

약간의 응접실 트릭으로 스크립트가 우리가 선택한 인터프리터에게 전달된다는 것을 보여줄 수 있습니다.

#!/bin/cat
All the lines of text are passed to the cat command
and are printed in the terminal window. That includes
the shebang line.
script2.sh

cat 명령에 전달하여 스크립트 실행

이 스크립트는 현재 쉘에 의해 시작되고 cat 명령. 그만큼 cat 명령은 스크립트를 “실행”합니다.

이와 같이 shebangs를 작성하는 것은 대상 시스템에서 쉘이나 다른 인터프리터가 있는 위치를 알고 있다고 가정합니다. 그리고 99%는 괜찮습니다. 그러나 어떤 사람들은 자신의 내기를 헤지하고 다음과 같이 셰뱅을 쓰는 것을 좋아합니다.

#!/usr/bin/env bash

echo Running in $SHELL
script3.sh

쉘을 검색하는 스크립트 실행

스크립트가 실행될 때 쉘 검색 명명된 쉘의 위치에 대해. 쉘이 비표준 위치에 있는 경우 이러한 유형의 접근 방식은 “잘못된 인터프리터” 오류를 피할 수 있습니다.

듣지 마세요, 그는 거짓말을 하고 있습니다!

Linux에는 고양이 가죽을 벗기거나 작성자가 틀렸음을 증명하는 방법이 항상 한 가지 이상 있습니다. 완전히 사실에 입각하여 스크립트를 실행 가능하게 만들지 않고 shebang 없이 실행할 수 있는 방법이 있습니다.

스크립트를 실행하려는 셸을 시작하고 스크립트를 명령줄 매개변수로 전달하면 셸이 실행 가능 여부에 관계없이 스크립트를 실행하고 실행합니다. 명령줄에서 쉘을 선택하기 때문에 shebang이 필요하지 않습니다.

다음은 전체 스크립트입니다.

echo "I've been executed by" $SHELL

우리는 사용할 것입니다 ls 스크립트가 실제로 실행 가능하지 않은지 확인하고 스크립트 이름으로 Bash를 시작합니다.

ls
bash script4.sh

실행 파일 권한이 설정되지 않고 shebang이 없는 스크립트 실행

스크립트를 실행하는 방법도 있습니다. 현재의 스크립트를 실행하기 위해 특별히 시작된 셸이 아니라 셸입니다. 사용하는 경우 source 단일 마침표 “로 축약될 수 있는 명령.“, 스크립트는 현재 쉘에서 실행됩니다.

따라서 실행 파일 권한 없이 실행 파일 권한 없이 스크립트를 실행하려면 다음 명령 중 하나를 사용할 수 있습니다.

source script4.sh
. script4.sh

현재 쉘에서 스크립트 실행

이것이 가능하지만 일반적인 솔루션으로는 권장되지 않습니다. 단점이 있습니다.

스크립트에 shebang이 포함되어 있지 않으면 어떤 쉘을 위해 작성되었는지 알 수 없습니다. 1년뒤에 기억할꺼야? 스크립트에 실행 권한을 설정하지 않으면 ls 명령은 이를 실행 파일로 식별하지 않으며 스크립트를 일반 텍스트 파일과 구별하기 위해 색상을 사용하지도 않습니다.

관련된: 명령줄: 사람들이 여전히 귀찮게 하는 이유는 무엇입니까?

2. 텍스트 인쇄

터미널에 텍스트를 쓰는 것은 일반적인 요구 사항입니다. 약간의 시각적 피드백은 큰 도움이 됩니다.

간단한 메시지의 경우 echo 명령이면 충분합니다. 텍스트의 일부 서식을 허용하고 변수로 작업할 수도 있습니다.

#!/bin/bash

echo This is a simple string.
echo "This is a string containing 'single quotes' so it's wrapped in double quotes."
echo "This prints the user name:" $USER
echo -e "The -e option lets us usenformatting directivesnto split the string."
./script5.sh

echo 명령을 사용하여 터미널 창에 쓰는 스크립트

그만큼 printf 명령은 숫자 변환을 포함하여 더 많은 유연성과 더 나은 서식 기능을 제공합니다.

이 스크립트는 세 가지 다른 숫자 기반을 사용하여 동일한 숫자를 인쇄합니다. 16진수 버전도 대문자로 인쇄되도록 형식이 지정되어 있으며 앞에 0이 있고 너비가 3자리입니다.

#!/bin/bash

printf "Decimal: %d, Octal: %o, Hexadecimal: %03Xn" 32 32 32
./script6.sh

숫자를 변환하고 형식을 지정하기 위해 printf를 사용하는 스크립트

와 달리 참고 echo당신은 말해야합니다 printf “로 새 줄을 시작하려면n“토큰.

3. 변수 생성 및 사용

변수를 사용하면 프로그램 내부에 값을 저장하고 조작하고 사용할 수 있습니다. 고유한 변수를 생성하거나 시스템 값에 환경 변수를 사용할 수 있습니다.

#!/bin/bash

millennium_text="Years since the millennium:"

current_time=$( date '+%H:%M:%S' )
todays_date=$( date '+%F' )
year=$( date '+%Y' )

echo "Current time:" $current_time
echo "Today's date:" $todays_date

years_since_Y2K=$(( year - 2000 ))

echo $millennium_text $years_since_Y2K

이 스크립트는 millennium_text. 그것은 한 줄의 텍스트를 담고 있습니다.

그런 다음 세 개의 숫자 변수를 만듭니다.

  • 그만큼 current_time 변수는 스크립트가 실행되는 시간으로 초기화됩니다.
  • 그만큼 todays_date 변수는 스크립트가 실행되는 날짜로 설정됩니다.
  • 그만큼 year 변수는 현재 연도를 보유합니다.

액세스하려면 변수에 저장하려면 이름 앞에 달러 기호 “$”를 붙입니다.

./script7.sh

변수를 사용하여 기간을 계산하는 스크립트

스크립트는 시간과 날짜를 인쇄한 다음 천년 이후 몇 년이 지났는지 계산하고 이를 저장합니다. years_since_Y2K 변하기 쉬운.

마지막으로 파일에 포함된 문자열을 인쇄합니다. millennium_text 변수와 에 저장된 숫자 값 years_since_Y2K.

관련된: Bash에서 변수로 작업하는 방법

4. 사용자 입력 처리

사용자가 스크립트에서 사용할 값을 입력할 수 있도록 하려면 사용자의 키보드 입력을 캡처할 수 있어야 합니다. 배쉬 read 명령을 사용하면 바로 그렇게 할 수 있습니다. 다음은 간단한 예입니다.

#!/bin/bash

echo "Enter a number and hit "Enter""
read user_number1;
echo "Enter another number and hit "Enter""
read user_number2;

printf "You entered: %d and %dn" $user_number1 $user_number2
printf "Added together they make: %dn" $(( user_number1 + user_number2))

스크립트는 두 개의 숫자를 입력하라는 메시지를 표시합니다. 그것들은 키보드에서 읽고 두 개의 변수에 저장됩니다. user_number1 그리고 user_number2 .

스크립트는 터미널 창에 숫자를 인쇄하고 함께 더한 다음 합계를 인쇄합니다.

./script8.sh

읽기 명령으로 사용자 입력 캡처

프롬프트를 다음과 같이 결합할 수 있습니다. read 다음을 사용하는 명령 -p (프롬프트) 옵션.

#!/bin/bash

read -p "Enter a number and hit "Enter" " user_number1;
read -p "Enter another number and hit "Enter" " user_number2;

printf "You entered: %d and %dn" $user_number1 $user_number2
printf "Added together they make: %dn" $(( user_number1 + user_number2))

이것은 내용을 더 깔끔하고 읽기 쉽게 만듭니다. 읽기 쉬운 스크립트는 디버그하기도 더 쉽습니다.

./script9.sh

읽기 명령 및 -p(프롬프트) 옵션으로 사용자 입력 캡처

이제 스크립트가 약간 다르게 작동합니다. 사용자 입력은 프롬프트와 같은 줄에 있습니다.

터미널 창에 반향하지 않고 키보드 입력을 캡처하려면 다음을 사용하십시오. -s (무음) 옵션.

#!/bin/bash

read -s -p "Enter your secret PIN and hit "Enter" " secret_PIN;

printf "nShhh ... it is %dn" $secret_PIN
./script10.sh

터미널 창에 쓰지 않고 사용자 입력 캡처

입력 값은 캡처되어 라는 변수에 저장됩니다. secret_PIN 하지만 사용자가 그것을 입력. 그 후에 무엇을 하느냐는 당신에게 달려 있습니다.

5. 매개변수 수락

때로는 스크립트가 입력을 기다리게 하는 것보다 명령줄 매개변수로 사용자 입력을 받아들이는 것이 더 편리합니다. 스크립트에 값을 전달하는 것은 쉽습니다. 다른 변수인 것처럼 스크립트 내에서 참조할 수 있습니다.

첫 번째 매개변수가 변수가 됩니다. $1두 번째 매개변수가 변수가 됩니다. $2, 등등. 변하기 쉬운 $0 항상 스크립트의 이름을 보유하고 변수 $# 명령줄에 제공된 매개변수의 수를 보유합니다. 변하기 쉬운 $@ 모든 명령줄 매개변수를 포함하는 문자열입니다.

#!/bin/bash

printf "This script is called: %sn" $0
printf "You used %d command line parametersn" $#

# loop through the variables
for param in "$@"; do
  echo "$param"
done

echo "Parameter 2 was:" $2

이 스크립트는 $0 그리고 $# 일부 정보를 인쇄합니다. 그런 다음 사용 ?@ 모든 명령줄 매개변수를 반복합니다. 그것은 사용 $2 단일 특정 매개변수 값에 액세스하는 방법을 보여줍니다.

./script11.sh

스크립트와 함께 명령줄 매개변수 사용

여러 단어를 따옴표 “””로 묶으면 단일 매개변수로 결합됩니다.

6. 파일에서 데이터 읽기

파일에서 데이터를 읽는 방법을 아는 것은 훌륭한 기술입니다. 우리는 이것을 while 루프로 Bash에서 할 수 있습니다.

#!/bin/bash

LineCount=0

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

  ((LineCount++))
  echo "Reading line $LineCount: ${LinefromFile}"

done < "$1"

스크립트가 명령줄 매개변수로 처리할 파일의 이름을 전달하고 있습니다. 유일한 매개변수이므로 스크립트 내부에서 $1 파일 이름을 유지합니다. 우리는 그 파일을 while 고리.

Linux Bash 스크립트에서 파일을 한 줄씩 처리하는 방법

관련된Linux Bash 스크립트에서 파일을 한 줄씩 처리하는 방법

그만큼 while 루프는 다음을 사용하여 내부 필드 구분 기호를 빈 문자열로 설정합니다. IFS='' 과제. 이것은 방지 read 공백에서 줄을 분할하는 명령. 줄 끝에 있는 캐리지 리턴만 줄의 실제 끝으로 간주됩니다.

그만큼 [[ -n "${LinefromFile}" ]] 절은 파일의 마지막 줄이 캐리지 리턴으로 끝나지 않을 가능성을 충족합니다. 그렇지 않은 경우에도 마지막 줄은 올바르게 처리되고 일반 POSIX 호환 줄로 처리됩니다.

./script12.sh twinkle.txt

스크립트로 파일에서 텍스트 읽기

7. 조건부 테스트 사용

스크립트가 다른 조건에 대해 다른 작업을 수행하도록 하려면 조건부 테스트를 수행해야 합니다. 이중 괄호 테스트 구문은 처음에는 압도적인 수의 옵션을 제공합니다.

#!/bin/bash

price=$1

if [[ price -ge 15 ]];
then
  echo "Too expensive."
else
  echo "Buy it!"
fi

Bash는 파일이 있는지 여부, 파일에서 읽을 수 있는지, 쓸 수 있는지, 디렉토리가 있는지 여부와 같은 항목을 결정할 수 있는 전체 비교 연산자 세트를 제공합니다.

같음에 대한 수치 테스트도 있습니다. -qe보다 큰 -gt작거나 같음 -le등등. 익숙한 것을 사용할 수도 있지만 == , >= , <= 표기법.

./script13.sh 13
./script13.sh 14
./script13.sh 15
./script13.sh 16

조건부 테스트로 스크립트 실행

8. for 루프의 힘

반복 작업은 루프를 사용하여 가장 잘 수행됩니다. ㅏ for 루프를 사용하면 루프를 여러 번 실행할 수 있습니다. 이것은 특정 숫자까지일 수도 있고 루프가 항목 목록을 통해 작동할 때까지일 수도 있습니다.

#!/bin/bash

for (( i=0; i<=$1; i++ ))
do
  echo "C-style for loop:" $i
done

for i in {1..4}
do
  echo "For loop with a range:" $i
done

for i in "zero" "one" "two" "three"
do
  echo "For loop with a list of words:" $i
done

website="How To Geek"

for i in $website
do
  echo "For loop with a collection of words:" $i
done

이 모든 루프는 for 루프이지만 서로 다른 유형의 루프 문 및 데이터로 작업하고 있습니다.

./script14.sh 3

4가지 다른 유형의 for 루프로 스크립트 실행하기

첫 번째 루프는 고전적인 C 스타일입니다. for 고리. 루프 카운터 i 0으로 초기화되고 루프의 각 주기와 함께 증가합니다. 의 가치가 i 에 보유된 값보다 작거나 같습니다. $1루프가 계속 실행됩니다.

두 번째 루프는 1에서 4까지의 숫자 범위에서 작동합니다. 세 번째 루프는 단어 목록을 통해 작동합니다. 처리할 단어가 더 있는 동안 루프는 계속 반복됩니다.

마지막 루프는 문자열 변수의 단어 목록을 통해 작동합니다.

9. 기능

함수를 사용하면 스크립트 내 어디에서나 호출할 수 있는 명명된 루틴으로 코드 섹션을 캡슐화할 수 있습니다.

파일에서 줄을 읽는 스크립트가 각 줄에서 일종의 처리를 수행하기를 원한다고 가정합니다. 해당 코드가 함수 내에 포함되어 있으면 편리합니다.

#!/bin/bash

LineCount=0

function count_words() {
  printf "%d words in line %dn" $(echo $1 | wc -w) $2
}

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

  ((LineCount++))
  count_words "$LinefromFile" $LineCount

done < "$1"

count_words "This isn't in the loop" 99

라는 함수를 추가하여 파일 읽기 프로그램을 수정했습니다. count_words. 정의된다 ~ 전에 우리는 그것을 사용할 필요가 있습니다.

함수 정의는 단어로 시작합니다. function. 그 뒤에 우리 함수의 고유한 이름이 오고 그 뒤에 괄호 “().” 함수의 본문은 중괄호 “{}” 안에 포함됩니다.

함수 정의로 인해 코드가 실행되지 않습니다. 함수가 호출될 때까지 함수의 아무 것도 실행되지 않습니다.

그만큼 count_words 함수는 텍스트 줄의 단어 수와 줄 번호를 출력합니다. 이 두 매개변수는 매개변수가 스크립트에 전달되는 것처럼 함수에 전달됩니다. 첫 번째 매개변수는 기능 변하기 쉬운 $1그리고 두 번째 매개변수는 함수 변수가 됩니다. $2등등.

그만큼 while 루프는 파일에서 각 라인을 읽고 그것을 count_words 줄 번호와 함께 기능. 그리고 스크립트 내의 다른 위치에서 함수를 호출할 수 있다는 것을 보여주기 위해 스크립트 외부에서 한 번 더 호출합니다. while 고리.

./script15.sh twinkle.txt

함수를 사용하는 스크립트 실행

학습 곡선을 두려워하지 마십시오

스크립팅은 보람 있고 유용하지만 시작하기 어렵습니다. 재사용 가능한 몇 가지 기술을 습득하면 가치 있는 스크립트를 비교적 쉽게 작성할 수 있습니다. 그런 다음 더 고급 기능을 살펴볼 수 있습니다.

달릴 수 있기 전에 걷고, 여행을 즐길 시간을 가지십시오.

관련된: 초보자를 위한 10가지 기본 Linux 명령