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

변수를 사용하는 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 쉘에서 변수를 인용하는 것을 잊어 버린 보안 관련 사항을 읽어보십시오.

안녕하세요 세계

대화 형 셸

배쉬 쉘은 일반적으로 대화 형으로 사용된다 : 그것은 당신이 입력 할 수 있습니다하고 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이라고도합니다.

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

사용자 입력이있는 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"이 추가됩니다.

명명 된 인수 처리

#!/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

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=

문자열에서 인용의 중요성

인용은 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

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