Linux 시작을 위한 9가지 Bash 스크립트 예제
게시 됨: 2022-07-05
Linux에서 Bash 스크립팅을 시작하는 경우 기본 사항을 확실히 이해하는 것이 좋습니다. 그것들은 더 깊은 지식과 더 높은 스크립팅 기술의 기초입니다.
스크립트를 실행 가능하게 만드십시오.
셸에서 스크립트를 실행하려면 스크립트에 실행 파일 권한이 설정되어 있어야 합니다. 이것이 없으면 스크립트는 텍스트 파일일 뿐입니다. 그것으로, 그것은 여전히 텍스트 파일이지만 쉘은 명령이 포함되어 있음을 알고 스크립트가 시작될 때 실행을 시도합니다.
스크립트 작성의 요점은 스크립트가 실행된다는 것이므로 첫 번째 기본 단계는 스크립트가 실행 가능한 것으로 간주되어야 함을 Linux에 알리는 방법을 아는 것입니다.
chmod
명령을 사용하면 파일 권한을 설정할 수 있습니다. 실행 권한은 +x 플래그로 설정할 수 있습니다.
chmod +x 스크립트1.sh
각 스크립트에 대해 이 작업을 수행해야 합니다. "script1.sh"를 스크립트 이름으로 바꿉니다.
1. 그 이상한 첫 번째 줄은 무엇입니까?
스크립트의 첫 번째 줄은 해당 스크립트를 실행하기 위해 호출되어야 하는 인터프리터를 쉘에 알려줍니다. 첫 번째 줄은 해시뱅(hashbang)이라고도 하는 셰뱅(#!)으로 시작해야 합니다. "#!" 스크립트가 작성된 인터프리터의 경로와 이름이 이 행에 포함되어 있음을 쉘에 알립니다.
이것은 Bash에서 실행할 스크립트를 작성한 경우 다른 쉘에서 해석되는 것을 원하지 않기 때문에 중요합니다. 호환되지 않을 가능성이 있습니다. Bash는 대부분의 셸과 마찬가지로 다른 셸에는 없거나 다르게 구현했을 고유한 구문과 기능을 가지고 있습니다.
스크립트를 실행하면 현재 셸이 스크립트를 열고 해당 스크립트를 실행하는 데 사용해야 하는 셸이나 인터프리터를 결정합니다. 그런 다음 해당 셸을 시작하고 스크립트를 전달합니다.
#!/bin/bash echo $SHELL에서 실행
이 스크립트의 첫 번째 줄은 "이 스크립트를 실행하려면 /bin/bash에 있는 인터프리터를 사용하십시오."로 읽을 수 있습니다.
스크립트의 유일한 줄은 $SHELL
환경 변수에 있는 값을 터미널 화면에 기록합니다. 이것은 Bash가 스크립트를 실행하는 데 사용되었음을 확인합니다.
./스크립트1.sh
약간의 응접실 트릭으로 스크립트가 우리가 선택한 인터프리터에게 전달된다는 것을 보여줄 수 있습니다.
#!/bin/고양이 모든 텍스트 줄은 cat 명령으로 전달됩니다. 터미널 창에 인쇄됩니다. 그것은 포함 시뱅 라인.
스크립트2.sh
이 스크립트는 현재 쉘에 의해 실행되고 cat
명령에 전달됩니다. cat
명령은 스크립트를 "실행"합니다.
이와 같이 shebangs를 작성하는 것은 대상 시스템에서 쉘이나 다른 인터프리터가 있는 위치를 알고 있다고 가정합니다. 그리고 99%는 괜찮습니다. 그러나 어떤 사람들은 자신의 내기를 헤지하고 다음과 같이 셰뱅을 쓰는 것을 좋아합니다.
#!/usr/bin/env bash echo $SHELL에서 실행
스크립트3.sh
스크립트가 실행되면 쉘은 명명된 쉘의 위치를 검색 합니다. 쉘이 비표준 위치에 있는 경우 이러한 유형의 접근 방식은 "잘못된 인터프리터" 오류를 피할 수 있습니다.
듣지 마세요, 그는 거짓말을 하고 있습니다!
Linux에는 고양이 가죽을 벗기거나 작성자가 틀렸음을 증명하는 방법이 항상 한 가지 이상 있습니다. 완전히 사실에 입각하여 스크립트를 실행 가능하게 만들지 않고 shebang 없이 실행할 수 있는 방법이 있습니다.
스크립트를 실행하려는 셸을 시작하고 스크립트를 명령줄 매개변수로 전달하면 셸이 실행 가능 여부에 관계없이 스크립트를 실행하고 실행합니다. 명령줄에서 쉘을 선택하기 때문에 shebang이 필요하지 않습니다.
전체 스크립트는 다음과 같습니다.
echo "$SHELL에 의해 처형되었습니다."
ls
를 사용하여 스크립트가 실제로 실행 가능하지 않은지 확인하고 스크립트 이름으로 Bash를 시작합니다.
엘
배시 스크립트4.sh
스크립트를 실행하기 위해 특별히 실행된 셸이 아니라 현재 셸에서 스크립트를 실행하는 방법도 있습니다. 하나의 마침표로 축약될 수 있는 source
명령을 사용하는 경우 " .
", 스크립트는 현재 쉘에서 실행됩니다.
따라서 실행 파일 권한 없이 실행 파일 권한 없이 스크립트를 실행하려면 다음 명령 중 하나를 사용할 수 있습니다.
소스 스크립트4.sh
. 스크립트4.sh
이것이 가능하지만 일반적인 솔루션으로는 권장되지 않습니다. 단점이 있습니다.
스크립트에 shebang이 포함되어 있지 않으면 어떤 쉘을 위해 작성되었는지 알 수 없습니다. 1년 뒤에 기억할 건가요? 그리고 스크립트에 실행 권한이 설정되지 않은 경우 ls
명령은 이를 실행 파일로 식별하지 않으며 스크립트를 일반 텍스트 파일과 구별하기 위해 색상을 사용하지도 않습니다.
관련: 명령줄: 사람들이 여전히 귀찮게 하는 이유는 무엇입니까?
2. 텍스트 인쇄
터미널에 텍스트를 쓰는 것은 일반적인 요구 사항입니다. 약간의 시각적 피드백은 큰 도움이 됩니다.
간단한 메시지의 경우 echo
명령으로 충분합니다. 텍스트의 일부 서식을 허용하고 변수로 작업할 수도 있습니다.
#!/bin/bash echo 이것은 단순한 문자열입니다. echo "'작은 따옴표'를 포함하는 문자열이므로 큰 따옴표로 묶습니다." echo "이것은 사용자 이름을 출력합니다:" $USER echo -e "-e 옵션을 사용하면\n형식 지정 지시문을 사용하여\n문자열을 분할할 수 있습니다."
./스크립트5.sh
printf
명령은 숫자 변환을 포함하여 더 많은 유연성과 더 나은 서식 기능을 제공합니다.
이 스크립트는 세 가지 다른 숫자 기반을 사용하여 동일한 숫자를 인쇄합니다. 16진수 버전도 대문자로 인쇄되도록 형식이 지정되어 있으며 앞에 0이 있고 너비가 3자리입니다.
#!/bin/bash printf "10진수: %d, 8진수: %o, 16진수: %03X\n" 32 32 32
./스크립트6.sh
echo
와 달리 " \n
" 토큰으로 새 줄을 시작하도록 printf
에 알려야 합니다.
3. 변수 생성 및 사용
변수를 사용하면 프로그램 내부에 값을 저장하고 조작하고 사용할 수 있습니다. 고유한 변수를 생성하거나 시스템 값에 환경 변수를 사용할 수 있습니다.
#!/bin/bash millennium_text="천년 이후 년:" current_time=$( 날짜 '+%H:%M:%S' ) 오늘_날짜=$( 날짜 '+%F' ) 연도=$( 날짜 '+%Y' ) echo "현재 시간:" $current_time echo "오늘 날짜:" $todays_date years_since_Y2K=$(( 연도 - 2000 )) echo $millennium_text $years_since_Y2K
이 스크립트는 millennium_text
라는 문자열 변수를 만듭니다. 그것은 한 줄의 텍스트를 담고 있습니다.
그런 다음 세 개의 숫자 변수를 만듭니다.
-
current_time
변수는 스크립트가 실행된 시간으로 초기화됩니다. -
todays_date
변수는 스크립트가 실행되는 날짜로 설정됩니다. -
year
변수는 현재 연도를 보유합니다.
변수에 저장된 값 에 액세스하려면 이름 앞에 달러 기호 "$"를 붙입니다.
./스크립트7.sh
스크립트는 시간과 날짜를 인쇄한 다음 천년 이후 몇 년이 지났는지 계산하고 이를 years_since_Y2K
변수에 저장합니다.
마지막으로 millennium_text
변수에 포함된 문자열과 years_since_Y2K
에 저장된 숫자 값을 출력합니다.
관련: Bash에서 변수로 작업하는 방법
4. 사용자 입력 처리
사용자가 스크립트에서 사용할 값을 입력할 수 있도록 하려면 사용자의 키보드 입력을 캡처할 수 있어야 합니다. Bash read
명령을 사용하면 ut가 그렇게 할 수 있습니다. 다음은 간단한 예입니다.
#!/bin/bash echo "숫자를 입력하고 \"Enter\"를 누르십시오." user_number1 읽기; echo "다른 번호를 입력하고 \"Enter\"를 누르십시오." user_number2 읽기; printf "입력하셨습니다: %d 및 %d\n" $user_number1 $user_number2 printf "함께 추가하면 %d\n" $(( user_number1 + user_number2))
스크립트는 두 개의 숫자를 입력하라는 메시지를 표시합니다. 키보드에서 읽고 user_number1
및 user_number2
두 변수에 저장됩니다.

스크립트는 터미널 창에 숫자를 인쇄하고 함께 더한 다음 합계를 인쇄합니다.
./스크립트8.sh
-p
(prompt) 옵션을 사용하여 프롬프트를 read
명령에 결합할 수 있습니다.
#!/bin/bash read -p "숫자를 입력하고 \"Enter\"를 누르십시오. " user_number1; read -p "다른 번호를 입력하고 \"Enter\"를 누르십시오. " user_number2; printf "입력하셨습니다: %d 및 %d\n" $user_number1 $user_number2 printf "함께 추가하면 %d\n" $(( user_number1 + user_number2))
이것은 내용을 더 깔끔하고 읽기 쉽게 만듭니다. 읽기 쉬운 스크립트는 디버그하기도 더 쉽습니다.
./스크립트9.sh
이제 스크립트가 약간 다르게 작동합니다. 사용자 입력은 프롬프트와 같은 줄에 있습니다.
터미널 창에 반향하지 않고 키보드 입력을 캡처하려면 -s
(무음) 옵션을 사용하십시오.
#!/bin/bash read -s -p "비밀 PIN을 입력하고 \"Enter\"를 누르십시오. " secret_PIN; printf "\n쉿... %d입니다\n" $secret_PIN
./스크립트10.sh
입력 값은 secret_PIN
이라는 변수에 캡처되어 저장되지만 사용자가 입력할 때 화면에 반향되지 않습니다 . 그 후에 무엇을 하느냐는 당신에게 달려 있습니다.
5. 매개변수 수락
때로는 스크립트가 입력을 기다리게 하는 것보다 명령줄 매개변수로 사용자 입력을 받아들이는 것이 더 편리합니다. 스크립트에 값을 전달하는 것은 쉽습니다. 다른 변수인 것처럼 스크립트 내에서 참조할 수 있습니다.
첫 번째 매개변수는 변수 $1
이 되고 두 번째 매개변수는 변수 $2
가 되는 식입니다. 변수 $0
은 항상 스크립트의 이름을 보유하고 변수 $#
는 명령행에 제공된 매개변수의 수를 보유합니다. $@
변수는 모든 명령줄 매개변수를 포함하는 문자열입니다.
#!/bin/bash printf "이 스크립트가 호출되었습니다: %s\n" $0 printf "%d 명령줄 매개변수를 사용했습니다\n" $# # 변수를 순환 "$@"의 매개변수에 대해; 하다 echo "$param" 완료 echo "매개변수 2는:" $2
이 스크립트는 $0
및 $#
를 사용하여 일부 정보를 인쇄합니다. 그런 다음 ?@
를 사용하여 모든 명령줄 매개변수를 반복합니다. $2
를 사용하여 단일 특정 매개변수 값에 액세스하는 방법을 보여줍니다.
./스크립트11.sh
여러 단어를 따옴표 """로 묶으면 단일 매개변수로 결합됩니다.
6. 파일에서 데이터 읽기
파일에서 데이터를 읽는 방법을 아는 것은 훌륭한 기술입니다. 우리는 이것을 while 루프로 Bash에서 할 수 있습니다.
#!/bin/bash 라인카운트=0 IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; 하다 ((라인카운트++)) echo "$LineCount 라인 읽기: ${LinefromFile}" 완료 < "$1"
스크립트가 명령줄 매개변수로 처리할 파일의 이름을 전달하고 있습니다. 유일한 매개변수이므로 스크립트 내에서 $1
은 파일 이름을 보유합니다. 우리는 그 파일을 while
루프로 리디렉션하고 있습니다.
while
루프는 IFS=''
할당을 사용하여 내부 필드 구분 기호를 빈 문자열로 설정합니다. 이것은 read
명령이 공백에서 줄을 분할하는 것을 방지합니다. 줄 끝에 있는 캐리지 리턴만 줄의 실제 끝으로 간주됩니다.
[[ -n "${LinefromFile}" ]]
절은 파일의 마지막 줄이 캐리지 리턴으로 끝나지 않을 가능성을 충족합니다. 그렇지 않은 경우에도 마지막 줄은 올바르게 처리되고 일반 POSIX 호환 줄로 처리됩니다.
./script12.sh 반짝임.txt
7. 조건부 테스트 사용
스크립트가 다른 조건에 대해 다른 작업을 수행하도록 하려면 조건부 테스트를 수행해야 합니다. 이중 괄호 테스트 구문은 처음에는 압도적인 수의 옵션을 제공합니다.
#!/bin/bash 가격=$1 if [[ 가격 -ge 15 ]]; 그 다음에 echo "너무 비싸." 또 다른 echo "사세요!" 파이
Bash는 파일이 있는지 여부, 파일에서 읽을 수 있는지, 쓸 수 있는지, 디렉토리가 있는지 여부와 같은 항목을 결정할 수 있는 전체 비교 연산자 세트를 제공합니다.
또한 익숙한 ==
, >=
, <=
표기법을 사용할 수도 있지만 equals -qe
, 보다 큼 -gt
, 보다 작거나 같음 -le
등에 대한 수치 테스트가 있습니다.
./script13.sh 13
./script13.sh 14
./script13.sh 15
./script13.sh 16
8. for 루프의 힘
반복 작업은 루프를 사용하여 가장 잘 수행됩니다. for
루프를 사용하면 루프를 여러 번 실행할 수 있습니다. 이것은 특정 숫자까지일 수도 있고 루프가 항목 목록을 통해 작동할 때까지일 수도 있습니다.
#!/bin/bash (( i=0; i<=$1; i++ )) 하다 echo "C 스타일 for 루프:" $i 완료 {1..4}의 i에 대해 하다 echo "범위가 있는 For 루프:" $i 완료 나는 "0" "하나" "둘" "셋" 하다 echo "단어 목록이 있는 For 루프:" $i 완료 웹사이트="괴짜 방법" 나는 $website에서 하다 echo "단어 모음이 있는 For 루프:" $i 완료
이 모든 루프는 for
루프이지만 서로 다른 유형의 루프 문 및 데이터와 함께 작동합니다.
./script14.sh 3
첫 번째 루프는 고전적인 C 스타일 for
루프입니다. 루프 카운터 i
는 0으로 초기화되고 루프의 각 주기와 함께 증가합니다. i
의 값이 $1
에 있는 값보다 작거나 같은 동안 루프는 계속 실행됩니다.
두 번째 루프는 1에서 4까지의 숫자 범위에서 작동합니다. 세 번째 루프는 단어 목록을 통해 작동합니다. 처리할 단어가 더 있는 동안 루프는 계속 반복됩니다.
마지막 루프는 문자열 변수의 단어 목록을 통해 작동합니다.
9. 기능
함수를 사용하면 스크립트 내 어디에서나 호출할 수 있는 명명된 루틴으로 코드 섹션을 캡슐화할 수 있습니다.
파일에서 줄을 읽는 스크립트가 각 줄에서 일종의 처리를 수행하기를 원한다고 가정합니다. 해당 코드가 함수 내에 포함되어 있으면 편리합니다.
#!/bin/bash 라인카운트=0 함수 count_words() { printf "%d 줄의 단어 %d개\n" $(echo $1 | wc -w) $2 } IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; 하다 ((라인카운트++)) count_words "$LinefromFile" $LineCount 완료 < "$1" count_words "이것은 루프에 있지 않습니다" 99
count_words
라는 함수를 추가하여 파일 읽기 프로그램을 수정했습니다. 사용 하기 전에 정의됩니다.
함수 정의는 function
이라는 단어로 시작합니다. 이것은 함수의 고유한 이름 다음에 괄호 " ()
"가 옵니다. 함수의 본문은 중괄호 "{}" 안에 포함됩니다.
함수 정의로 인해 코드가 실행되지 않습니다. 함수가 호출될 때까지 함수의 아무 것도 실행되지 않습니다.
count_words
함수는 텍스트 줄의 단어 수와 줄 번호를 인쇄합니다. 이 두 매개변수는 매개변수가 스크립트에 전달되는 것처럼 함수에 전달됩니다. 첫 번째 매개변수는 함수 변수 $1
이 되고 두 번째 매개변수는 함수 변수 $2
가 되는 식입니다.
while
루프는 파일에서 각 줄을 읽고 줄 번호와 함께 count_words
함수에 전달합니다. 그리고 스크립트 내의 다른 위치에서 함수를 호출할 수 있다는 것을 보여주기 위해 while
루프 외부에서 한 번 더 호출합니다.
./script15.sh 반짝임.txt
학습 곡선을 두려워하지 마십시오
스크립팅은 보람 있고 유용하지만 시작하기 어렵습니다. 재사용 가능한 몇 가지 기술을 습득하면 가치 있는 스크립트를 비교적 쉽게 작성할 수 있습니다. 그런 다음 더 고급 기능을 살펴볼 수 있습니다.
달릴 수 있기 전에 걷고, 여행을 즐길 시간을 가지십시오.
관련: 초보자를 위한 10가지 기본 Linux 명령