Linux, macOS 또는 다른 UNIX 계열 시스템에서 Bash 셸을 마스터하려면 특수 문자(예: ~, *, | 및 >)가 중요합니다. 우리는 당신이 이러한 신비한 Linux 명령 시퀀스를 풀고 상형 문자의 영웅이 되도록 도울 것입니다.
목차
특수 문자란 무엇입니까?
캐릭터 세트가 있다 배쉬 쉘 두 가지 다른 방식으로 취급합니다. 쉘에 입력하면 명령이나 명령으로 작동하여 쉘에 특정 기능을 수행하도록 지시합니다. 단일 문자 명령으로 생각하십시오.
때로는 문자를 인쇄하기만 하고 마술 기호 역할을 하는 데 필요하지 않은 경우가 있습니다. 특수 기능 대신 문자를 사용하여 자신을 나타낼 수 있는 방법이 있습니다.
어떤 문자가 “특수” 또는 “메타-” 문자인지, 그리고 기능적으로나 문자 그대로 사용할 수 있는지 보여드리겠습니다.
~ 홈 디렉토리
물결표(~)는 홈 디렉토리의 줄임말입니다. 이는 명령에 홈 디렉토리의 전체 경로를 입력할 필요가 없음을 의미합니다. 파일 시스템에 있는 모든 위치에서 이 명령을 사용하여 홈 디렉토리로 이동할 수 있습니다.
cd ~
상대 경로와 함께 이 명령을 사용할 수도 있습니다. 예를 들어, 홈 폴더 아래가 아닌 파일 시스템의 어딘가에 있고 작업 디렉터리의 아카이브 디렉터리로 변경하려는 경우 물결표를 사용하여 수행합니다.
cd ~/work/archive
. 현재 디렉토리
마침표(.)는 현재 디렉토리를 나타냅니다. ls와 함께 -a(all) 옵션을 사용하면 디렉토리 목록에서 볼 수 있습니다.
ls -a
명령에 마침표를 사용하여 현재 디렉토리의 경로를 나타낼 수도 있습니다. 예를 들어, 현재 디렉토리에서 스크립트를 실행하려면 다음과 같이 호출합니다.
./script.sh
이것은 Bash가 현재 디렉토리에서 script.sh 파일을 찾도록 지시합니다. 이렇게 하면 실행 파일이나 스크립트와 일치하는 경로의 디렉터리를 검색하지 않습니다.
.. 부모 디렉토리
이중 마침표 또는 “이중 점”(..)은 현재 디렉토리의 상위 디렉토리를 나타냅니다. 이것을 사용하여 디렉토리 트리에서 한 레벨 위로 이동할 수 있습니다.
cd ..
예를 들어 디렉터리 트리에서 한 수준 위로 이동한 다음 해당 수준에서 다른 디렉터리를 입력하려는 경우와 같이 이 명령을 상대 경로와 함께 사용할 수도 있습니다.
또한 이 기술을 사용하여 현재 디렉토리와 동일한 수준의 디렉토리 트리로 빠르게 이동할 수 있습니다. 한 수준 위로 이동한 다음 다른 디렉터리로 다시 아래로 이동합니다.
cd ../gc_help
/ 경로 디렉토리 구분자
슬래시(/)(종종 단순히 슬래시라고도 함)를 사용하여 경로 이름에서 디렉토리를 구분할 수 있습니다.
ls ~/work/archive
하나의 슬래시는 가능한 가장 짧은 디렉토리 경로를 나타냅니다. Linux 디렉터리 트리의 모든 항목은 루트 디렉터리에서 시작하므로 이 명령을 사용하여 루트 디렉터리로 빠르게 이동할 수 있습니다.
cd /
# 주석 처리 또는 문자열 자르기
대부분의 경우 해시 또는 숫자 기호(#)를 사용하여 쉘에 뒤에 오는 것이 주석임을 알리고 이에 따라 작동하지 않아야 합니다. 쉘 스크립트에서 사용할 수 있으며 덜 유용하지만 명령줄에서 사용할 수 있습니다.
# This will be ignored by the Bash shell
그러나 명령 기록에 추가되기 때문에 실제로 무시되지는 않습니다.
해시를 사용하여 문자열 변수를 자르고 처음부터 일부 텍스트를 제거할 수도 있습니다. 이 명령은 this_string이라는 문자열 변수를 생성합니다.
이 예에서는 “Dave Geek!”이라는 텍스트를 할당합니다. 변수에.
this_string="Dave Geek!"
이 명령은 echo를 사용하여 터미널 창에 “How-To”라는 단어를 인쇄합니다. 다음을 통해 문자열 변수에 저장된 값을 검색합니다. 매개변수 확장. 해시와 텍스트 “Dave”를 추가하기 때문에 echo에 전달되기 전에 문자열의 해당 부분을 잘라냅니다.
echo How-To ${this_string#Dave}
이것은 문자열 변수에 저장된 값을 변경하지 않습니다. 에코로 전송되는 내용에만 영향을 미칩니다. echo를 사용하여 문자열 변수의 값을 한 번 더 인쇄하고 다음을 확인할 수 있습니다.
echo $this_string
? 단일 문자 와일드카드
Bash 셸은 세 개의 와일드카드를 지원하며 그 중 하나는 물음표(?)입니다. 와일드카드를 사용하여 파일 이름 템플릿의 문자를 바꿉니다. 와일드카드가 포함된 파일 이름은 하나가 아닌 파일 이름 범위와 일치하는 템플릿을 형성합니다.
물음표 와일드카드는 정확히 하나의 문자를 나타냅니다. 다음 파일 이름 템플릿을 고려하십시오.
ls badge?.txt
이것은 “이름이 ‘badge’로 시작하고 파일 이름 확장자 앞에 단일 문자가 오는 모든 파일을 나열합니다.”로 번역됩니다.
다음 파일과 일치합니다. 파일 이름의 “배지” 부분 뒤에 숫자가 있는 것도 있고 문자가 있는 것도 있습니다. 물음표 와일드카드는 문자와 숫자 모두와 일치합니다.
그 파일 이름 템플릿은 “badge.txt”와 일치하지 않습니다. 왜냐하면 파일 이름은 “badge”와 파일 확장자 사이에 단일 문자가 없기 때문입니다. 물음표 와일드카드는 파일 이름의 해당 문자와 일치해야 합니다.
물음표를 사용하여 파일 이름에 특정 문자 수가 있는 모든 파일을 찾을 수도 있습니다. 다음은 파일 이름에 정확히 5자를 포함하는 모든 텍스트 파일을 나열합니다.
ls ?????.txt
* 문자 시퀀스 와일드카드
별표를 사용할 수 있습니다
ls badge*
와일드카드는 문자 없음을 포함하여 모든 문자 시퀀스를 나타냅니다. 다음 파일 이름 템플릿을 고려하십시오.
안
와일드카드는 일련의 문자를 나타내거나 문자를 나타내지 않기 때문에 “badge.txt”와 일치합니다.
ls source.*
[] 안
문자 집합 와일드카드
위에서 다룬 것처럼 물음표를 사용하여 단일 문자를 나타내고 별표를 사용하여 모든 문자 시퀀스(문자 없음 포함)를 나타냅니다. [] 대괄호(
) 및 포함된 문자. 그런 다음 파일 이름의 관련 문자는 와일드카드 문자 집합의 문자 중 하나 이상과 일치해야 합니다.
ls badge_0[246].txt
안
ls badge_[01][789].txt
안
ls badge_[23][1-5].txt
안
; 셸 명령 구분 기호
ls > count.txt; wc -l count.txt; rm count.txt
안
count.txt; 화장실 -l count.txt; 터미널 창의 rm count.txt” 명령’ width=”646″ height=”122″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>
두 번째 명령은 첫 번째가 실패해도 실행되고 세 번째 명령은 두 번째가 실패해도 실행되는 식입니다.
cd ./doesntexist && cp ~/Documents/reports/* .
ㅏ
및 백그라운드 프로세스
터미널 창에 명령을 입력하고 완료되면 명령 프롬프트로 돌아갑니다. 일반적으로 이 작업은 1~2분 정도 걸립니다. 그러나 gedit와 같은 다른 응용 프로그램을 실행하면 응용 프로그램을 닫을 때까지 터미널 창을 사용할 수 없습니다.
gedit command_address.page &
ㅏ
Bash는 시작된 항목의 프로세스 ID를 표시한 다음 명령줄로 돌아갑니다. 그런 다음 터미널 창을 계속 사용할 수 있습니다.
sortWhen a command has input redirected into it, it might behave differently than when it reads from a named file.
If we use wc to count the words, lines, and characters in a file, it prints the values, and then the filename. If we redirect the contents of the file to wc, it prints the same numeric values but doesn’t know the name of the file from which the data came. It cannot print a filename.
Here are some examples of how you can use wc:
wc words.txtwc> Output Redirection
You can use the right-angle bracket ( > ) to redirect the output from a command (typically, into a file); here’s an example:
ls > files.txtcat files.txt안
터미널 창에서 "files.txt" 명령." 너비="646" 높이="382" >
wc doesntexist.txt 2> errors.txtcat errors.txtㅏ
터미널 창에서 "errors.txt" 명령." 너비="646" 높이="122" >
| 파이프
"파이프"는 명령을 함께 연결합니다. 한 명령의 출력을 가져와 다음 명령에 입력으로 제공합니다. 파이프된 명령의 수(체인 길이)는 임의적입니다.
여기에서 우리는 grep에 단어.txt 파일의 내용을 공급하기 위해 cat을 사용할 것입니다. grep은 소문자 또는 대문자 "C"를 포함하는 모든 줄을 추출합니다. 그런 다음 grep은 이 줄을 전달하여 정렬합니다. sort는 -r(역방향) 옵션을 사용하므로 정렬된 결과가 역순으로 나타납니다.
cat words.txt | grep [cC] | sort -rㅏ
! 파이프라인 논리 NOT 및 기록 연산자
느낌표(!)는 NOT을 의미하는 논리 연산자입니다.
[ ! -d ./backup ] && mkdir ./backup이 명령줄에는 두 가지 명령이 있습니다.
첫 번째 명령은 대괄호 안에 있는 텍스트입니다.두 번째 명령은 이중 앰퍼샌드 && 다음에 오는 텍스트입니다.
첫 번째 명령은 ! 논리 연산자로. 대괄호는 테스트가 진행 중임을 나타냅니다. -d(디렉토리) 옵션은 백업이라는 디렉토리가 있는지 테스트합니다. 두 번째 명령은 디렉토리를 생성합니다.
이중 앰퍼샌드가 두 명령을 분리하기 때문에 Bash는 첫 번째 명령이 성공하는 경우에만 두 번째 명령을 실행합니다. 그러나 그것은 우리가 필요로 하는 것과 정반대입니다. "backup" 디렉토리에 대한 테스트가 성공하면 생성할 필요가 없습니다. 그리고 "backup" 디렉토리에 대한 테스트가 실패하면 두 번째 명령이 실행되지 않고 누락된 디렉토리가 생성되지 않습니다.
이것은 논리 연산자 ! 논리적 NOT 역할을 합니다. 따라서 테스트가 성공하면(즉, 디렉토리가 존재함), ! 그것을 "성공이 아님"으로 바꾸는데, 이는 실패입니다. 따라서 두 번째 명령은 활성화되지 않습니다.
디렉토리 테스트가 실패하면(즉, 디렉토리가 존재하지 않음), ! 성공인 "NOT 실패"로 응답을 변경합니다. 따라서 누락된 디렉토리를 생성하는 명령이 실행됩니다.
그 작은 ! 당신이 그것을 필요로 할 때 많은 펀치를 포장!
ls -l -d backupㅏ
!24ㅏ
!!다음은 이전 명령을 다시 실행합니다.
$ 변수 표현식 Bash 셸에서 값을 저장할 변수를 만듭니다. 일부, 같은 환경 변수,
항상 존재하며 터미널 창을 열 때마다 액세스할 수 있습니다. 여기에는 사용자 이름, 홈 디렉터리 및 경로와 같은 값이 포함됩니다.
echo $USERecho $HOMEecho $PATH안
ThisDistro=UbuntuMyNumber=2001echo $ThisDistroecho $MyNumber안
달러 기호 주위에 중괄호( {} )를 추가하고 매개변수 확장을 수행하여 변수 값을 얻고 값의 추가 변환을 허용합니다.
MyString=123456qwerty그러면 아래와 같이 문자열을 포함하는 변수가 생성됩니다.
echo ${MyString}다음 명령을 사용하여 문자열을 터미널 창에 에코합니다.
echo ${myString:6}전체 문자열의 위치 6에서 시작하는 부분 문자열을 반환하려면 다음 명령을 사용합니다(오프셋이 0이므로 첫 번째 위치는 0입니다).
echo ${myString:0:6}위치 0에서 시작하고 다음 6자를 포함하는 부분 문자열을 에코하려면 다음 명령을 사용하십시오.
echo ${myString:4:4}ㅏ
특수 문자 인용
특수 문자를 리터럴(비특수) 문자로 사용하려면 Bash 쉘에 알려야 합니다. 이를 인용이라고 하며 세 가지 방법이 있습니다.
텍스트를 따옴표("...")로 묶으면 Bash가 대부분의 특수 문자에 대해 작동하지 않고 인쇄만 됩니다. 그러나 한 가지 주목할만한 예외는 달러 기호($)입니다. 여전히 변수 표현식의 문자로 작동하므로 출력에 변수의 값을 포함할 수 있습니다.
echo "Today is $(date)"예를 들어 다음 명령은 날짜와 시간을 인쇄합니다.
echo 'Today is $(date)'아래와 같이 텍스트를 작은따옴표('…')로 묶으면 모든 특수 문자의 기능이 중지됩니다.
echo "Today is $(date)"백슬래시( )를 사용하여 다음 문자가 특수 문자로 작동하지 않도록 할 수 있습니다. 이것을 문자 "이스케이프"라고 합니다. 아래 예를 참조하십시오.
특수 문자는 매우 짧은 명령으로 생각하십시오. 사용법을 기억한다면 Bash 셸과 다른 사람들의 스크립트를 이해하는 데 큰 도움이 될 것입니다.