배쉬 이론

/ bin / bash

0.인덱스

  1. 대부분의 사람들이 놓치는 것들
  2. 스크립트의 구조
  3. 화면에 인쇄
  4. 사용자 입력 읽기
  5. bash에서 계산
  6. 약관
  7. 루프
  8. 함수
  9. getops

1. 대부분의 사람들이 놓치는 것

/bin/bash 또는 /bin/sh

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

유니코드 대 ASCII

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

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

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

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

얼마나 많은 사람들이 "$ bashscript.sh" 대신에 "$ ./script.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 == "--도움말" ]]; 그럼 도와주세요

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

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

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

3. 화면에 인쇄

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

Echo는 매우 훌륭하고 대부분의 사람들이 사용하지만 사용자의 INPUT을 읽을 때 또는 텍스트 처리를 통해 파일에서 가져온 변수를 인쇄하려는 경우 이상한 일이 발생할 수 있습니다. 일반적으로 큰따옴표를 작은따옴표로 또는 그 반대로 변경하거나 따옴표에서 변수 참조를 제거하는 것처럼 쉽게 수정됩니다. «Echo» 또한 컴파일 방법에 따라 이상한 일을 합니다. 항상 Ubuntu 또는 항상 Fedora를 사용하는 경우에는 영향을 미치지 않지만 배포판을 변경하면 영향을 받습니다.

그래서 "를 사용합니다.printf«, 두통을 일으키지 않고 «처럼 행동합니다.printf» C 또는 «인쇄» 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 내 파일.txt

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

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

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

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

printf "당신의 이름은 무엇입니까?\n" read NAME printf "안녕하세요, $NAME.\n"
변수 할당에 주의하십시오. "$VAR = content"는 오류를 생성하며 등호, 변수 이름 및 내용 사이에 공백이 없어야 합니다. 올바른 사용법은 "VAR=콘텐츠"입니다.

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" == "--도움말" ]]; 그럼 도와주세요

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

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

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

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

말하지 않은 것은 "케이스«, «을 단순화하는 데 사용됩니다.if«. «가 없을 때 처음부터 시작하겠습니다.if» 모든 코드가 실행됩니다. 조건을 추가하면 «if» 두 가지 경우가 있는데, 하나는 « 안에 있는 코드 블록이if» 및 해당 블록이 실행되지 않는 다른 경우.

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

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

VAR1=$1 if [[ $VAR1 = 1 ]]; then printf "1\n" elif [[ $VAR1 = 2 ]]; then printf "2\n" elif [[ $VAR1 = 3 ]]; then 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"for «. 이미 다음과 같은 내용이 블로그에 기록되어 있습니다.

루프에는 두 가지 유형이 있습니다 «for «, « 유형의 사람들식품의 VAR에 대한 $» 유형 C는 무엇입니까 «((I=0; I<=10; I++))에 대한 $«. 루프의 두 번째 유형 «for »는 매우 유용하며 루프 시작 부분에 세 부분이 있습니다.

  • 변수 선언 및 초기화(이 경우 보조 변수 «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 hello" } printf "당신의 이름은 무엇입니까?\n" read VAR1 VAR1=$(hello) # 여기 있습니다 printf "$VAR1 $VAR2\n"

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

함수에 대한 자세한 내용은 [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]Usemoslinux의 이 기사[/url].

9. 게톱스

복잡한 스크립트를 생성하기 위해 알아야 할 마지막 Bash 사항 중 하나는 "getops«. 순서에 관계없이 스크립트에 옵션을 전달하는 데 사용됩니다. 유일한 문제는 짧은 옵션에만 영향을 미친다는 것입니다.

#!/bin/bash # -*- 인코딩: UTF-8 -*- VARC=0 function help() { printf "도움말 메시지\n" 종료 } if [[ -z $1 ]]; getopts 동안 fi를 도와주세요 :ha:b:c OPT; 케이스 $OPT in h) 도움말 ;; :) 돕다 ;; a) VARA=$OPTARG ;; b) VARB=$OPTARG ;; c) VARC=1 ;; \?) 돕다 ;; esac done # VARA, VARB 및 VARC로 # 작업을 수행하는 기본 스크립트 블록

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

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

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

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

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


코멘트를 남겨주세요

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

*

*

  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.   브루클린 아님

    축하해 주셔서 감사합니다. Miguel 명령과 관련하여 일단 게시되면 항목을 수정할 수 없습니다. Elav는 내가 상상하는 그것을해야 할 것입니다.

  9.   애드리안

    아주 좋아요!

    우선 게시물에 대해 축하하고 싶었습니다. 이해하기 쉬웠고 특히 프로그래밍을 시작하는 사람들에게 bash에서 잘 프로그래밍하기 위한 지침을 따르는 데 정말 도움이 되었습니다.

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

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

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

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

    1.    브루클린 아님

      귀하의 의견에 감사드립니다. 스크립트와 함수 모두에서 exit의 올바른 사용을 설명하는 것을 완전히 놓쳤습니다. ${10}에 관해서는 그렇게 많이 해 본 적이 없어서 그 문제에 부딪히지 않았습니다. 그에 대한 해결책이 있다는 것을 알게 되어 기쁩니다(오늘 배운 새로운 내용은 이미 삭제했습니다 😀 ).

  10.   차니오

    기사 주셔서 대단히 감사합니다! 당신이 언급한 것 중 일부는 명확히 해야 했습니다. 예를 들어, getops.
    화면에 출력되는 부분에서 나중에 언급하는 고양이를 언급하지 않으셨는데...
    고양이 <
    ***************************************
    *이 모양은 매우 표현력이 뛰어납니다*
    ***************************************
    EOF

    귀하의 예에서:
    고양이 << EOF >> test.sh
    두 가지 말씀드리자면... >> '추가' 즉, 같은 명령을 반복하면 전체 스크립트가 두 번 나오게 됩니다... 하나만 사용해야 합니다...
    고양이 << EOF > script.sh
    예, script.sh라고도 합니다.
    그런 다음
    if [ -z "$1" ] || [ "$1" == "-h" ] || [ "$1" == "--도움말" ]]; 그 다음에
    도움
    fi

    써야 할 것 같은데...
    if [[ -z "$1" ] || [ "$1" == "-h" ] || [ "$1" == "--도움말" ]]; 그 다음에
    ...

    BASH보다 더 많은 것을 발견할 수 있습니다.
    "BASICS"라는 제목을 붙일 수 있습니까? 🙂
    예를 들어 -z와 같은 매개변수 'tester'는 비어 있는지 확인하거나 -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…)를 작성하는 데 사용한다고 알리는 데 사용됩니다.

      사실, bash는 주석 행이기 때문에 해당 행을 볼 수 없습니다.

  13.   JORGE-1987

    Bash에서 스크립팅하는 방법을 알고 있는 시스템 관리자로서 훌륭한 튜토리얼은 모든 것에 도움이 됩니다.

    아주 하지만 아주 좋아요!

    안녕하십니까!

  14.   에두아르도 쿠 오모

    누군가에게 유용한 경우를 대비하여 다음은 자신만의 스크립트를 생성하기 위한 몇 가지 사용 및 예입니다. https://github.com/reduardo7/hsabx

  15.   리토 블랙

    매우 좋은. 내 스크립트에 추가할 새로운 항목. encode와 printf에는 없었습니다.
    감사합니다!!!

  16.   xxxtonixxx

    좋은 글이군요! 나는 이것을 즐겨 찾기에 저장하고 있습니다. 잘못된 것을 수정하고 더 많은 콘텐츠로 확장하는 것이 좋을 것입니다. 이 모든 정보에 박수를 보냅니다!!!!