BashBash 시작하기


버전

번역 출시일
0.99 1989-06-08
1.01 1989-06-23
2.0 1996-12-31
2.02 1998-04-20
2.03 1999-02-19
2.04 2001-03-21
2.05b 2002-07-17
3.0 2004-08-03
3.1 2005-12-08
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014-02-26
4.4 2016-09-15

명명 된 인수 처리

#!/bin/bash

deploy=false
uglify=false

while (( $# > 1 )); do case $1 in
   --deploy) deploy="$2";;
   --uglify) uglify="$2";;
   *) break;
 esac; shift 2
done

$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"

# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
 

안녕하세요 세계

대화 형 셸

배쉬 쉘은 일반적으로 대화 형으로 사용된다 : 그것은 당신이 입력 할 수 있습니다하고 Return 키를 누르면 편집 명령은 다음을 실행합니다. 많은 유닉스 기반 운영체제와 유닉스 계열 운영체제는 Bash를 기본 셸 (특히 Linux와 macOS)로 사용합니다. 터미널은 시작시 자동으로 Bash 쉘 대화식 프로세스로 들어갑니다.

다음을 입력하여 Hello World 를 출력하십시오.

echo "Hello World"
#> Hello World  # Output Example
 

노트

  • 터미널에 셸 이름을 입력하기 만하면 셸을 변경할 수 있습니다. 예 : sh , bash

  • echo 는 Bash 내장 명령으로받은 인수를 표준 출력에 씁니다. 기본적으로 출력에 개행을 추가합니다.


비대륙 형 쉘

Bash 쉘은 스크립트에서 비 대화식 으로 실행될 수 있으므로 쉘은 사람과의 상호 작용이 필요 없습니다. 대화식 동작과 스크립트 된 동작은 동일해야합니다. Unix V7 Bourne 셸 및 일시적 Bash에 대한 중요한 디자인 고려 사항입니다. 따라서 명령 줄에서 수행 할 수있는 모든 작업을 스크립트 파일에 넣어 재사용 할 수 있습니다.

다음 단계에 따라 Hello World 스크립트를 작성하십시오.

  1. hello-world.sh 라는 새 파일을 만듭니다.

    touch hello-world.sh
     
  2. chmod +x hello-world.sh 실행하여 스크립트를 실행 가능하게 만듭니다.

  3. 이 코드 추가 :

    #!/bin/bash
    echo "Hello World"
     

    행 1 : 스크립트의 첫 번째 줄은 문자 시퀀스로 시작해야합니다 #! , shebang 1 이라고도합니다. shebang은 운영 체제에 /bin/bash Bash 쉘)를 실행하여 스크립트의 경로를 인수로 전달하도록 지시합니다.

    예 : /bin/bash hello-world.sh

    2 행 : echo 명령을 사용하여 Hello World 를 표준 출력에 작성합니다.

  1. 다음 중 하나를 사용하여 명령 행에서 hello-world.sh 스크립트를 실행하십시오.

    • ./hello-world.sh - 가장 일반적으로 사용되며 권장됩니다.
    • /bin/bash hello-world.sh
    • bash hello-world.sh - $PATH/bin 이 있다고 가정하십시오.
    • sh hello-world.sh

실제 생산 사용을 위해, 당신은 생략 할 것이다 .sh (이것은 배쉬 스크립트가 아니라이기 때문에, 어쨌든 오해의 소지 확장을 sh 스크립트) 아마도 당신의 내 디렉토리에 파일을 이동 PATH 가 당신에게 사용할 수 있도록 관계없이 cat 또는 ls 와 같은 시스템 명령과 같은 현재 작업 디렉토리.

일반적인 실수는 다음과 같습니다.

  1. ./hello-world.sh: Permission denied 의 출력 결과로 chmod +x hello-world.sh 와 같은 파일에 대한 실행 권한을 적용하는 것을 잊어 chmod +x hello-world.sh ./hello-world.sh: Permission denied .

  2. Windows에서 스크립트를 편집하면 Bash가 처리 할 수없는 잘못된 줄 끝 문자가 생성됩니다.

    일반적인 증상은 : command not found . 캐리지 리턴이 커서를 줄의 시작 부분으로 옮겨서 오류 메시지의 콜론 앞에있는 텍스트를 덮어 씁니다.

    스크립트는 dos2unix 프로그램을 사용하여 수정할 수 있습니다.

    사용 예 : dos2unix hello-world.sh

    dos2unix 는 파일을 인라인으로 편집합니다.

  3. sh ./hello-world.sh 사용하면 bashsh 가 별개의 기능을 가진 별개의 쉘이라는 것을 알지 못합니다 (Bash는 하위 호환이 가능하기 때문에 반대의 실수는 무해합니다).

    어쨌든, 단순히 스크립트의 세방 (shebang) 라인에 의존하는 것이 각 스크립트 파일 이름 앞에 bash 또는 sh (또는 python 또는 perl 또는 awk 또는 ruby 또는 ...)를 명시 적으로 작성하는 것보다 훨씬 낫습니다.

    스크립트를 더 이식성있게 만들기 위해 사용하는 공통적 인 줄은 Bash에 대한 경로를 하드 코딩하는 대신 #!/usr/bin/env bash 사용하는 것입니다. 그렇게하면 /usr/bin/env 가 존재해야하지만, 그 시점을 넘어선 bash PATH 에 있어야합니다. 많은 시스템에서 /bin/bash 는 존재하지 않으므로 /usr/local/bin/bash 또는 다른 절대 경로를 사용해야합니다. 이 변화는 그것의 세부 사항을 알아 내야하는 것을 피합니다.


1 또한 sha-bang, hashbang, pound-bang, hash-pling이라고도합니다.

Hello World의 "디버그"모드

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World
 

-x 사용하면 스크립트의 각 행을 -x 할 수 있습니다. 한 가지 좋은 예가 여기 있습니다.

$ cat hello.sh
#!/bin/bash 
echo "Hello World\n" 
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number) 

$ ./hello.sh 
Hello World

expr: non-integer argument
 

위의 프롬프트 된 오류는 스크립트를 추적하기에 충분하지 않습니다. 그러나 다음과 같은 방법을 사용하면 스크립트에서 오류를 찾을 위치를 더 잘 이해할 수 있습니다.

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
 

변수를 사용하는 Hello World

다음 내용으로 hello.sh 라는 새 파일을 만들고 chmod +x hello.sh 실행 권한을 부여하십시오.

다음을 통해 실행 / 실행 : ./hello.sh

#!/usr/bin/env bash

# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"

# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
 

이것은 실행될 때 Hello, World 를 표준 출력에 인쇄합니다.

스크립트가 어디에 필요한지 bash에게 알려주려면 포함 디렉토리 (일반적으로 작업 디렉토리 인 경우 ./ )로 지정하십시오 . 현재 디렉토리에 대한 별명입니다. 디렉토리를 지정하지 않으면 bash$PATH 환경 변수에 들어있는 디렉토리 중 하나에서 스크립트 위치를 찾습니다.


다음 코드에서는 첫 번째 명령 줄 인수 인 $1 인수를 사용하고 Hello, 뒤에 오는 형식이 지정된 문자열로 출력합니다.

다음을 통해 실행 / 실행 : ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
 

$1 은 작은 따옴표가 아닌 큰 따옴표로 인용되어야한다는 점에 유의해야합니다. "$1" 은 리터럴 문자열 $1 평가되지만 '$1' 은 원하는대로 첫 번째 명령 줄 인수로 확장됩니다.

보안 참고 사항 :
가변 텍스트를 큰 따옴표로 묶어야하는 중요성을 이해하기 위해 bash 쉘에서 변수를 인용하는 것을 잊어 버린 보안 관련 사항을 읽어보십시오.

사용자 입력이있는 Hello World

다음은 사용자에게 입력을 요구하고 그 입력을 문자열 (텍스트)로 변수에 저장합니다. 그런 다음이 변수를 사용하여 사용자에게 메시지를 보냅니다.

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."
 

명령 read 여기서 변수로 표준 입력 데이터의 한 행 판독 name . 이것은 $name 사용하여 참조되고 echo 를 사용하여 표준 출력으로 인쇄됩니다.

예제 출력 :

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
 

여기서 사용자는 "Matt"라는 이름을 입력했으며이 코드는 Hello, Matt. .

그리고 인쇄하는 동안 변수 값에 무엇인가를 추가하려면 다음 예와 같이 변수 이름 주위에 중괄호를 사용하십시오.

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."
 

예제 출력 :

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
 

여기에 사용자가 작업을 입력하면 인쇄 중에 해당 작업에 "ing"이 추가됩니다.

문자열에서 인용의 중요성

인용은 bash의 문자열 확장에 중요합니다. 이것들을 사용하여 bash가 문자열을 파싱하고 확장하는 방법을 제어 할 수 있습니다.

두 가지 유형의 인용이 있습니다.

  • Weak : 큰 따옴표를 사용합니다. "
  • Strong : 작은 따옴표 사용 : '

당신이 당신의 주장을 확장하기 위해 강탈하고 싶다면, 당신은 약한 인용을 사용할 수 있습니다 :

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
 

인수를 확장하기 위해 강탈하고 싶지 않다면 강한 인용을 사용할 수 있습니다 :

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
 

이스케이프를 사용하여 확장을 방지 할 수도 있습니다.

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
 

초보자 정보 이외의 자세한 내용은 여기에서 계속 읽을 수 있습니다 .

Bash 기본 제공 정보보기

help <command>
 

이렇게하면 지정된 내장에 대한 Bash 도움말 (수동) 페이지가 표시됩니다.

예를 들어 help unset 하면 다음과 같이 표시됩니다.

unset: unset [-f] [-v] [-n] [name ...]
   Unset values and attributes of shell variables and functions.

   For each NAME, remove the corresponding variable or function.

   Options:
     -f    treat each NAME as a shell function
     -v    treat each NAME as a shell variable
     -n    treat each NAME as a name reference and unset the variable itself
       rather than the variable it references

   Without options, unset first tries to unset a variable, and if that fails,
   tries to unset a function.

   Some variables cannot be unset; also see `readonly'.

   Exit Status:
   Returns success unless an invalid option is given or a NAME is read-only.
 

간단한 설명이있는 모든 내장 기능 목록을 보려면 다음을 사용하십시오.

help -d