배쉬 이론

/ bin / bash

0. 색인

  1. 대부분의 사람들에게 일어나는 일
  2. 스크립트의 구조
  3. 화면에 인쇄
  4. 사용자 입력 읽기
  5. Bash의 계산
  6. 약관
  7. 루프
  8. 함수
  9. 게탑스

1. 대부분의 사람들에게 일어나는 일

/ bin / bash 또는 / bin / sh

스크립트를 실행할 때 머신이 가장 먼저하는 일 중 하나는 어떤 셸을 사용해야하는지 살펴 보는 것입니다. 최신 Linux 시스템에서 / 빈 / SH 링크입니다 / bin / bash,하지만 항상 그런 것은 아닙니다. 예를 들어 비지 박스 그들은 가져온다. Sh 그리고 보통 그들은 또한 가져옵니다 강타,하지만 사용하는 경우 / 빈 / SH, Bash와 함께 실행되지 않습니다. 그래서 항상 사용하는 것이 좋습니다 / bin / bash.

유니 코드 대 ASCII

왜 스크립트에서 "¿"또는 "ñ"을 사용할 수 없는지 궁금한 적이 있습니까? 아니면 악센트를 사용합니까? 대화 형 스크립트에서는 상당히 성 가실 수 있습니다. 이는 Bash의 기본 인코딩이 ASCII이거나 영어 문자 집합과 동일하기 때문입니다. 이를 변경하려면 유니 코드를 사용하고 싶다는 스크립트 만 알려 주면됩니다. 이를 위해 명령 인터프리터 바로 뒤에 줄을 추가해야합니다.

#-*-인코딩 : UTF-8-*-

이 줄이 스크립트 시작 부분에 있어야합니다.

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

얼마나 많은 사람들이«$ bash 스크립트.sh" 대신에 "$ ./스크립트.sh'결국 이것이 우리가 쉘을 정의한 것입니다.

실행 권한을 추가하려면 다음을 실행해야합니다.

sudo + x script.sh
스크립트가 실행 가능한 경우 PATH에 추가하고 컴퓨터의 모든 / 폴더에서 실행할 수 있습니다. 이를 위해 사용자의 .bashrc 또는 / etc / bashrc에 다음 줄을 추가해야합니다.
BIN = "스크립트가있는 폴더"PATH = "$ BIN $ PATH"
변수 이름을 모두 대문자로 쓰는 것은 Bash 규칙입니다. 많은 사람들이이 규칙을 따르지 않지만 긴 스크립트의 경우 훨씬 더 가독성이 높기 때문에 높이 평가됩니다.

2. 스크립트 구조

  1. 헤더
  2. 전역 변수의 정의
  3. 도움
  4. 함수
  5. 본체

헤더는 우리가 사용할 쉘과 인코딩을 나타내는 곳입니다. 함수의 장점은 한 번만 작성하여 반복되는 코드를 재사용하고 스크립트를 더 쉽게 이해할 수 있도록하는 것입니다. 100 줄을 초과하는 코드는 매우 유용합니다.

함수를 사용하려면 스크립트 본문 앞에와 함께 정의해야합니다. 그리고 본문과 함수 모두에서 모든 스크립트의 전역 수준에서 변수를 사용하려면 헤더 바로 뒤 모든 것의 시작 부분에서 변수를 정의해야합니다.

마지막으로 스크립트가 잘못 실행되거나 매개 변수가 잘못된 경우에 대한 도우미 함수를 작성하는 것이 좋습니다. 이 경우 함수를 읽지 않고 즉시 스크립트를 종료하고 싶습니다. 이를 위해 다음을 사용할 수 있습니다.

function help () {echo "" "올바른 형식의 도움말 텍스트" ""exit if [[-z $ 1 || $ 1 == "-h"|| $ 1 == "--help"]]; 그럼 도와주세요

도움말 함수에 "exit"를 추가하면 도움말을 실행할 때마다 스크립트를 종료합니다 (예 : 오류 메시지 후 등). 몇 줄의 코드를 저장합니다.

조건은 화면에 도움말을 표시하고 스크립트가 매개 변수없이 실행되거나 -h / –help가 지정된 경우 종료됨을 나타냅니다. 보시면 대부분의 리눅스 프로그램의 표준 동작입니다.

echo와 함께 3 개의 따옴표를 사용하면 메시지를 echo로 표시하지 않고 줄 바꿈을 사용할 수 있습니다. 여러 줄 메시지의 경우 echo를 한 번만 사용하는 것이 훨씬 더 편리합니다.

3. 화면에 인쇄

bash에서 화면에 인쇄하기위한 두 가지 주요 명령이 있습니다.«에코"Y"printf«. 둘 다 빠르며 둘 다 bash의 일부입니다. 초보자를위한 주요 차이점은 echo는 끝에 개행 문자를 추가하는 반면«printf"하지 않습니다.

Echo는 매우 훌륭하고 대부분의 사람들이 사용하는 것입니다. 그러나 사용자의 INPUT을 읽거나 워드 프로세싱으로 파일에서 가져온 변수를 인쇄하려는 경우 이상한 일이 발생할 수 있습니다. 일반적으로 큰 따옴표를 작은 따옴표로 변경하거나 그 반대로 변경하거나 따옴표에서 변수 참조를 가져 오는 것처럼 쉽게 해결됩니다. «에코»컴파일 방법에 따라 이상한 일이 발생합니다. 항상 Ubuntu를 사용하거나 항상 Fedora를 사용하면 영향을주지 않지만 배포판을 변경하면 영향을받습니다.

그래서«printf«, 나에게 두통을주지 않고 더 좋아하는 행동«printf»C 또는 the«인쇄»Python의 경우 스크립트를 다른 프로그래밍 언어로 이식하려는 경우 매우 중요합니다.

보다 광범위한 토론을 보려면 다음을 방문하십시오. Stack Exchange의 Unix 및 Linux에서이 질문.

4. 사용자 입력 읽기

스크립트 이름 다음에 그리고 ENTER 키를 누르기 전에 작성하는 모든 내용은 특수 변수에 자동으로 저장됩니다. 이러한 변수는 $ X 유형이며 여기서 X는 숫자입니다.

«$0»스크립트의 이름과 출처를 나타냅니다.«$1»나중에 작성한 모든 내용은 무한대로 변합니다. 예를 들면 :

cat << EOF >> test.sh #! / bin / bash #-*-인코딩 : UTF-8-*-printf "\ $ 0 = $ 0 \ n"printf "\ $ 1 = $ 1 \ n"printf "\ $ 2 = $ 2 \ n"EOF chmod + x script.sh ./script.sh 내 file.txt

테스트 스크립트를 생성하고 실행 가능하게 만들고 2 개의 매개 변수로 실행합니다. 다음과 같은 화면 출력을 얻습니다.

$ 0 = ./script.sh $ 1 = 내 $ 2 = file.txt

따옴표를 사용하여 "my file.txt"를 "$ 1"로 전달할 수 있습니다.

또한 "read"명령으로 사용자의 INPUT을 읽어 매개 변수를 저장할 변수를 직접 나타낼 수도 있습니다. 예를 들면 :

printf "당신의 이름은 무엇입니까? \ n"NAME 읽기 printf "Hello, $ NAME. \ n"
변수 할당에주의하십시오. "$ VAR = content"는 오류를 생성하며 등호, 변수 이름 및 내용 사이에 공백을 둘 수 없습니다. 올바른 사용법은 "VAR = content"입니다.

5. Bash에서 계산

이를 위해«특급«복잡한 계산을 할 필요가없는 한. 두 가지를 주목해야합니다. 첫 번째는«특급»정수만 인정하고 두 번째는 나눗셈이 전체 결과를 반환하고 나머지를 사용할 수 있다는 것입니다.«%".

일반적으로 expr의 결과를 변수에 할당하려고합니다. 두 가지 방법으로 할 수 있습니다.

VAR2 =`expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)

«특급»이중 괄호 사용 :

VAR2 = $ (($ VAR1 / 100))
«에 대한 자세한 설명은특급»또는 정수를 사용하는 대안은 다음을 볼 수 있습니다. 이 KZKG ^ gaara 항목.

6 조건

이미«에 대해 매우 광범위한 방식으로 작성되었습니다.if«,«그렇지 않으면«,«ELIF»그리고 조건. 다음에서 이에 대해 읽을 수 있습니다.

단순한 대괄호 사용의 차이점을 강조하고 싶습니다.«[]«, 이중 대괄호,«[[]]«, 조건에 대해. 이중 괄호를 사용하면 추가 조건을 사용할 수 있습니다.

  • «&&»및
  • «||»또는

쓰다 "&&"Y"||»간단한 대괄호를 사용하면 각 부분을 별도의 대괄호로 구분해야합니다. 도움말을 실행해야하는지 확인하는 스크립트 부분에 사용되는 예제는 다음과 같습니다.

if [-z "$ 1"] || [ "$ 1"== "-h"] || [ "$ 1"== "--help"]]; 그럼 도와주세요

또한 오류를 방지하기 위해 따옴표 안에 변수 이름을 쓰지 않아도됩니다. 예를 들면 :

만약 [$ 1 = 1]; then printf "매개 변수는 1과 같습니다."; fi if [ "$ 1"= 1]; then printf "매개 변수는 1과 같습니다."; fi if [[$ 1 = 1]]; then printf "매개 변수는 1과 같습니다."; fi

script.sh가 매개 변수없이 실행되면 첫 번째 경우 오류가 발생합니다.

bash : [: = : 단항 연산자가 필요합니다.
Bash에서 "="및 "=="는 모두 같은 방식으로 해석됩니다. "="가 변수 할당에만 사용되는 다른 프로그래밍 언어에서는 발생하지 않습니다.

언급되지 않은 것은«케이스«, 단순화하는 데 사용되는«if«. «가없는 처음부터 시작하겠습니다.if»모든 코드가 실행됩니다. 조건을 추가하면«if»두 가지 경우가 있습니다. 하나는 내부에있는 코드 블록입니다.«if»그리고이 블록이 실행되지 않는 다른 경우.

«를 추가하면그렇지 않으면«또한 두 가지 사례가 있지만이 두 사례는 이전 사례와 다릅니다. 이제 두 개의 조건부 코드 블록 A와 B와 나머지 프로그램 인 C 블록이 있기 때문입니다. A 또는 B가 실행되고 C. 이전 경우에는 A와 C 또는 C 만 실행되었습니다.

쓰기 조건을 피하려면«다른 경우라면"내"그렇지 않으면»코드 읽기를 단순화하기 위해 생성되었습니다.«ELIF«. 예를 들어 숫자 범위 또는 유형과 같이 이전 조건에 의존하는 많은 조건이있는 경우 :

VAR1 = $ 1 if [[$ VAR1 = 1]]; 그런 다음 printf "1 \ n"elif [[$ VAR1 = 2]]; 그런 다음 printf "2 \ n"elif [[$ VAR1 = 3]]; 그런 다음 printf "3 \ n"else printf "없음 \ n"fi

마지막«ELIF»많은 조건을 읽습니다. 경우에 따라이 프로세스가 간소화됩니다.

VAR1 = $ 1 케이스 $ VAR in 1) printf "1 \ n";; 2) printf "2 \ n";; 3 | 4) printf "3 또는 4, \ n";; *) printf "없음 \ n";; 그 C

변수 (이 경우 VAR1)가 읽히고 어떤 경우와 동일한 지 확인하고 그렇지 않은 경우 기본 사례 "*"가 실행됩니다. 이중 세미콜론은«하다«, 그들은 말한다«케이스»종료해야합니다.

«케이스»시퀀스로도 사용 가능«if«,이를 위해서는«;;»대신«;; &»(계속)을 사용해야합니다. (중지).

7. 루프

모든 프로그래밍 언어에서 알려진 루프는 거의 없습니다. Bash에서는«동안«,«까지"Y"...에 대한«. 이미 블로그에 다음과 같이 작성되었습니다.

두 가지 유형의 루프가 있습니다.«...에 대한«, 해당 유형의 항목«LOQUESEA의 VAR에 대한 $»C 타입은 무엇입니까«$ for ((I = 0; I <= 10; I ++))«. 두 번째 유형의 루프«...에 대한»매우 유용합니다. 루프의 시작 부분에 세 부분이 있습니다.

  • 변수 선언 및 시작 (이 경우 보조 변수 "I = 0").
  • 실행 조건 (I가 10보다 작거나 같을 때까지).
  • 보조 변수의 증가

제 생각에는 가장 강력한 루프입니다. 다음을 포함하여 0에서 10까지의 모든 숫자를 인쇄하는 예 :

#! / bin / bash for ((I = 0; I <= 10; I ++)); printf "$ I \ n"완료

8. 기능

Bash가 우리에게 허용하지 않는 것들이 있습니다. 그렇죠? 얼핏 보면 bash 함수는 함수에서 지역 변수를 선언하고, 매개 변수를 함수에 전달하고, 매개 변수를 반환하는 세 가지 작업을 방해합니다. 모든 것이 해결책이 있습니다.

다음과 같이하지 마십시오.

#! / bin / bash VAR = 1 printc "$ VAR \ n"function hello () {VAR = 2 printf "$ VAR \ n"} hello printf "$ VAR \ n"

화면 1, 2, 2에 인쇄됩니다.

지역 변수를 선언하려면«지방의»선언 할 때 :

#! / bin / bash VAR = 1 printf "$ VAR1 \ n"function foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n"foo printf "$ VAR1 \ n"

그러면 화면에 1, 1, 2, 1이 인쇄됩니다.

매개 변수를 함수에 어떻게 전달합니까?

#! / bin / bash #-*-인코딩 : UTF-8-*-function hello () {printf "Hello $ 1 \ n"}

printf "이름이 뭐야? \ n"
VAR1 읽기
안녕하세요 $ VAR1

매개 변수는 어떻게 반환됩니까?

#! / bin / bash #-*-인코딩 : UTF-8-*-function hello () {printf "Hello holita"} printf "당신의 이름은 무엇입니까? \ n"read VAR1 VAR1 = $ (hello) # HERE IT IS printf "$ VAR1 $ VAR2 \ n"

보시다시피 두 가지 단점이 있습니다. 벡터가 될 수있는 하나의 매개 변수 만 반환 할 수 있습니다. 그리고 매개 변수를 반환하려면 해당 함수에서 더 이상 화면에 인쇄 할 수 없습니다.

함수에 대한 자세한 내용은 [url = https : //blog.desdelinux.net/programando-en-bash-parte-3/]이 Usemoslinux 기사 [/ url]에서 찾을 수 있습니다.

9. 게탑스

복잡한 스크립트를 만들기 위해 Bash에 대해 알아야 할 마지막 사항 중 하나는«게톱스«. 순서에 관계없이 스크립트에 옵션을 전달하는 데 사용됩니다. 유일한 단점은 매도 옵션에만 영향을 미친다는 것입니다.

#! / bin / bash #-*-인코딩 : UTF-8-*-VARC = 0 function help () {printf "Help message \ n"exit} if [[-z $ 1]]; getopts 동안 fi를 돕습니다. ha : b : c OPT; h) help ;; :) 도움말 ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) 도움말 ;; esac done # VARA, VARB 및 VARC로 작업을 수행하는 스크립트의 주요 블록

«게옵트»옵션을 하나씩 읽으므로 루프가 필요합니다.

«를 사용하여 전달할 수있는 두 가지 유형의 옵션이 있습니다.getopts":

  • 플래그라고하는 매개 변수,이 경우 -c 또는 -h. 그들은 우리가 사용하려는 문자로 지정됩니다. 부울 변수,«참된»(Are) 또는«그릇된"(그들은 여기에 없습니다).
  • 연관된 인수가있는 매개 변수, -a any, -b any. 아래에 콜론이있는 원하는 문자로 지정됩니다. 인수는 OPTARG에 저장됩니다 (이 이름은 변경할 수 없음).
초기 이중 점은 오류를 표시하지 않는 것입니다.

이 스크립트는 무엇을합니까?

옵션이 전달되지 않거나, "-h"매개 변수가 전달 될 때, 유효하지 않은 매개 변수가 전달 될 때 (예 : "-x", "\?"에 의해 수행됨) 또는 유효한 매개 변수가없는 경우 도움말 메시지를 표시합니다. 인수 ( ":"). 나머지 경우에는 VARC에서 "-c"의 존재를 1로 저장하고 VARA 및 VARB에서 "-a"및 "-b"로 전달 된 값을 저장합니다.


기사의 내용은 우리의 원칙을 준수합니다. 편집 윤리. 오류를보고하려면 여기에.

20 코멘트, 당신의 것을 남겨주세요

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   엘라 브

    대가 다운. 더 이상 말하지 않아 U_U

  2.   미겔

    안녕하세요 아주 좋은 기사입니다.
    이봐 당신은 chmod + x 대신 sudo + x 권한을 부여했습니다.

    1.    헨리

      $ sudo chmod + x script.sh
      (정확히 말하자면 헤헤)

      아, 축하합니다. 감사합니다!

  3.   불의

    아주 좋은 게시물, 진실은 내가 당신을 축하합니다.

  4.   구스타보

    스크립트가 실행될 때 단계별로 표시되도록하려면 예를 들어 변수, 조건 및 모든 것이 어떻게 작동하는지 확인하려면 다음을 사용할 수 있습니다.

    sh -x 스크립트

    안부

  5.   스페인 사람

    후견의 조각. 훌륭하고 잘 설명되었습니다.
    그라시아.

  6.   가브리엘

    주제에 대한 우수한 게시물 😉

  7.   마리오 기예르모 자 발라 실바

    매우 흥미롭고 중요합니다. 정보에 감사드립니다….
    건배 !!!

  8.   브루클린 아님

    축하 해주셔서 감사합니다. 미구엘 사령부는 일단 게시 된 항목을 수정하도록 허용하지 않습니다. 내가 상상하는 elav를해야 할 것입니다.

  9.   애드리안

    아주 좋아요!

    우선 포스트에 대해 축하하고 싶었습니다. 이해하기 쉬웠으며 특히 프로그램을 막 시작한 사람들을 위해 bash에서 잘 프로그램하기위한 지침을 따르는 것이 정말 도움이되었습니다.

    그러나 수정해야 할 몇 가지 세부 사항을 찾았습니다.

    첫째 : 섹션«2. 스크립트 구조»함수가 닫히지 않아 스크립트에서 실행할 때 문제가 발생합니다.
    해결책은 "exit"명령 바로 뒤에 중괄호를 추가하는 것입니다.

    둘째 : 섹션«4. READ THE USER INPUT "사용자가 입력 할 수있는 매개 변수의 범위는 $ 0에서 무한대까지이지만"bash "는 $ 0에서 $ 9까지만 해석합니다. $ 10은 $ 1 + 0과 같기 때문입니다.
    이 문제를 해결하려면 "shift"명령을 사용하여 다음 변수를 가져올 수 있습니다. 또는 중괄호 "$ {10}"에 변수를 지정하여 bash가 $ 1 + 0이 아닌 값을 함께 가져 오도록합니다.

    더 이상 고민하지 않고 인사드립니다!

    1.    브루클린 아님

      귀하의 의견에 감사드립니다. 스크립트와 함수 모두에서 이탈의 올바른 사용을 완전히 설명하지 못했습니다. $ {10}에 관해서는 그렇게 많은 것을 물려받은 적이 없기 때문에 그 문제에 부딪히지 않았습니다. 그에 대한 해결책이 있다는 것을 아는 것이 좋습니다 (오늘 배운 새로운 것을 이미 지 웠습니다 😀).

  10.   Chanio

    기사 주셔서 대단히 감사합니다! 당신이 언급 한 어떤 것들은 아직 명확하지 않았습니다. 예를 들어, getops.
    화면 출력 부분에서 나중에 언급 한 고양이를 언급해야했습니다.
    고양이 <
    ***************************************
    *이 양식은 매우 표현 적입니다 *
    ***************************************
    EOF

    귀하의 예에서 :
    고양이 << EOF >> test.sh
    언급 할 두 가지가 있습니다 ... >> 그것은 '추가'입니다. 즉, 동일한 명령을 반복하면 전체 스크립트가 중복됩니다 ... 하나만 사용해야합니다 ...
    고양이 << EOF> script.sh
    예, script.sh라고도합니다.
    그런 다음
    if [-z "$ 1"] || [ "$ 1"== "-h"] || [ "$ 1"== "–help"]]; 그때
    도움
    fi

    써야한다고 생각합니다 ...
    if [[-z "$ 1"] || [ "$ 1"== "-h"] || [ "$ 1"== "–help"]]; 그때
    ...

    BASH에서 더 많은 것을 발견 할 수 있습니다.
    "BASICS"라는 제목을 붙일 수 있습니까? 🙂
    예를 들어 매개 변수 'testers'는 -z와 같이 비어 있는지 확인하고 -f는 파일로 존재하는지 확인합니다.

    귀하의 노력에 다시 한번 감사드립니다.
    알베르토

  11.   clow_eriol

    아주 좋은 bash 스크립트 튜토리얼!

  12.   ocz

    --인코딩 : UTF-8--

    bash 스크립트에서 문자 인코딩을 설정하는 줄을 본 것은 처음입니다. 나에게는 Bash보다 Python과 더 비슷해 보입니다. 정말 필요한가요? Google에서 참조를 검색했지만 아무것도 찾을 수 없습니다.이 문제에 대해 설명하는 링크가 있습니까? 특히 그 라인의 적합성에.

    제 생각에는 UTF-8을 사용하여 Bash에서 스크립트를 작성하려면 텍스트 파일을 BOM없이 그대로 저장하고 특정 환경 변수 (LANG 및 LC_ *)를 올바르게 설정하면됩니다.
    그런 다음 실행 된 명령은 ASCII 이외의 인코딩을 위해 준비되어야합니다. 예를 들어 대문자로 바꾸려면 작동하지 않는 것 같습니다.
    «에코 áéíóú | tr az AZ»
    o:
    «에코 áéíóú | tr [: 하단 :] [: 상단 :]»
    다음을 사용하는 것이 좋습니다.
    «에코 áéíóú | awk '{print toupper ($ 0)}'».

    1.    브루클린 아님

      대한 "부호화»이 블로그에서 이전에 언급 된 내용 :

      Bash : 스크립트를 실행 가능하게 만드는 방법
      설치 후 유틸리티 스크립트

    2.    너 같은 보리 키토

      누군가 나를 정정하지만 그 인코딩 라인 (#--인코딩 : UTF-8--) bash 또는 셸과는 아무 관련이 없습니다. 주석 줄 (#로 시작)이며 파일의 인코딩을 스크립트 (vim, emacs ...)를 작성하는 데 사용하는 EDITOR에게 알려주는 역할을합니다.

      사실, bash는 주석 행이기 때문에 그러한 행을 보지 않습니다.

  13.   JORGE-1987

    Sysadmin이 Bash에서 스크립팅이 필수적이라는 것을 알고있는 훌륭한 튜토리얼은 모든 것에 유용합니다.

    아주 아주 좋은!

    안녕하십니까!

  14.   에두아르도 쿠 오모

    누구에게나 유용 할 경우 다음과 같은 몇 가지 용도와 예제를 통해 자신 만의 스크립트를 만들 수 있습니다. https://github.com/reduardo7/hsabx

  15.   리토 블랙

    아주 좋아요. 내 스크립트에 추가 할 새로운 것. encodig와 printf는 그것을 가지고 있지 않았습니다.
    감사합니다!!!

  16.   xxxtonixxx

    Sooo 좋은 기사! 나는 이것을 즐겨 찾기에 보관합니다. 잘못된 것을 수정하고 더 많은 콘텐츠로 확장하는 것이 좋을 것입니다. 이 모든 정보에 대한 박수 !!!!